我正在使用STL關聯容器(std::set
和std::map
)以及包含std::unique_ptr<>
實例的鍵。主要定義等效於以下:STL關聯容器:清除並獲取(不可複製)元素
struct Key
{
std::unique_ptr<Object> object;
bool operator== (const Key& rhs) const { return object->equal (*rhs.object); }
bool operator< (const Key& rhs) const { return object->less (*rhs.object); }
}
已知STL關聯容器(尤其因爲C++ 11。)不具有一種方式來獲得非const參照從移動鍵。而且我的密鑰是不可複製的,所以c++: Remove element from container and get it back不起作用。
有沒有非UB的方法來克服這個問題?
我目前的解決方案是以下幾點:
template <typename T>
using map_pair_type = std::pair<typename T::key_type, typename T::mapped_type>;
template <typename T>
typename T::value_type take_set (T& container, typename T::iterator iterator)
{
typename T::value_type result = std::move (const_cast<typename T::value_type&> (*iterator));
container.erase (iterator);
return result;
}
template <typename T>
map_pair_type<T> take_map (T& container, typename T::iterator iterator)
{
map_pair_type<T> result {
std::move (const_cast<typename T::key_type&> (iterator->first)),
std::move (iterator->second)
};
container.erase (iterator);
return result;
}
_「是否有非UB方式來解決這個問題?」_編號[N3645](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3645 .pdf)可能會有所幫助,但該提案已被拒絕,並且未被再次提交。 – 2014-12-27 21:09:54