【发布时间】:2012-01-08 11:59:12
【问题描述】:
所以我有一个智能迭代器来模拟映射 const_iterator,它需要在内部构建返回类型。显然,我想在我的迭代器类中存储一个pair<Key, Value>(因为我需要修改它),但同时我希望解引用函数呈现一个pair<const Key, Value>(实际上它是一个@分别为 987654324@ 和 const pair<const Key, Value>*)。到目前为止,我提出的唯一解决方案是每次更改我的迭代器类指向的值更改时动态分配一个新对。不用说,这不是一个好的解决方案。
我也尝试过*const_cast<const pair<const Key, Value> >(&value),其中value 被声明为pair<Key, Value>。
任何帮助将不胜感激(知道无法完成)。
编辑
出于好奇:我最终在我的迭代器类中存储了一个pair<const Key, Value> p。为了更改对,我根据底层迭代器 (map<Key, Value>::const_iterator it) 分别更改两个元素,const_casting 键以便可以更改它,如下所示:
*const_cast<Key*>(&p.first) = it->first;
p.second = it->second;
不是我非常满意的解决方案,但它可以完成工作,并且取消引用方法很高兴,因为我存储了正确类型的东西,它们可以引用。
【问题讨论】:
-
很难相信你会不遗余力地发布这篇小论文,甚至没有尝试:
std::pair<int, double> p(1,2); std::pair<const int, double> q = p; // fine -
@Kerrek SB:我认为你忽略了 Op 问题的一个重要部分。他希望避免在每次调用他的自定义迭代器的取消引用/成员选择运算符时构造一个新的对对象。这在 operator-> 中变得尤为重要,因为这意味着他的迭代器必须潜在地存储一个成员对并在每次调用函数或迭代器递增/递减时复制到它。
-
@KerrekSB:谢谢你教我一个问题的教训。以后我会努力把自己表达的更清楚。
-
我很好奇
std::map是怎么做到的,因为它有extract()。使用 Apple 的 Clang STL,该节点拥有std::pair<const K, V>。该节点有一个__ref(),它返回一个std::pair<K&, V&>,它通过const_cast生成密钥。虽然 en.cppreference.com/w/cpp/container/node_handle 说node_handle是 UB “如果 std::pair或 std::pair 存在用户定义的 std::pair 特化”,(为我怀疑是整对投射),我的实现似乎避免了这种情况。
标签: c++ stl constants const-cast std-pair