我正在使用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