我正在维护一个容器类,其接口类似于std::map
/ std::unordered_map
。
界面声称存储std::pair<const X,Y>
(即value_type
是什么)。但是,在内部,实现存储了std::pair<X,Y>
的排序数组。
当前实现使用reinterpret_cast
来实现迭代器。我的问题是,有更好的选择吗?
移动到存储std::pair<const X,Y>
数组是不可能的,因为实现需要复制数组中的元素以实现插入和删除。其中一种方法是使用std::sort
。
编辑:虽然我相信reinterpret_cast
会调用未定义的行为(或实现已定义?)但我还没有遇到过编译器无法解决的问题 - 我不担心什么?
迭代器解除引用的当前实现:
template <class K, class M>
std::pair<const K,M>& operator*() {
std::pair<K,M>& result = ...;
return *reinterpret_cast<std::pair<const K,M>*)(&result);
}
答案 0 :(得分:2)
我相信你无法通过返回std::pair
来解决这个问题。相反,您将不得不像标准对一样返回看起来的代理对象,但如果更新second
成员,它会传播到主容器,而第一个成员根据需要公开为const
。
答案 1 :(得分:1)
“更好的选择?” reinterpret_cast
有什么问题?在这种情况下,由于您在具有兼容(实际上是相同)表示的对象之间进行转换,因此转换甚至是明确定义的。