我有以下类包装C映射 . 我只是'd like to override just the iterator dereference, to return the map'的值而不是键 . 这有可能,而不必重新实现整个 std::map
迭代器(我应该尽可能避免)吗?
这里是:
#include <map>
using std::map;
class X {
using Type = map<int, double>;
using const_iterator = typename Type::const_iterator;
public:
void insert(int key, double value) {
my_map[key] = value;
}
const_iterator cbegin() const { return my_map.cbegin(); }
const_iterator cend() const { return my_map.cend(); }
const_iterator begin() const { return my_map.cbegin(); }
const_iterator end() const { return my_map.cend(); }
private:
Type my_map;
};
int main() {
X x;
double i;
for (const auto& it : x) {
i = it.second; // works
i = it; // fails
}
}
2 回答
您几乎需要实现整个迭代器类型以提供新的迭代器行为 . 幸运的是,Boost有一些工具可以使这更容易:boost::iterator_facade是一个创建迭代器类型的工具,它负责满足标准定义的各种类型迭代器的所有需求细节 . 对于你想要创建一个包装另一个迭代器的迭代器的常见情况,只覆盖它的一部分功能,那就是boost::iterator_adaptor .
所以你可以像这样定义你的
X::const_iterator
:...
(我故意将名称
X::const_iterator
的访问权限从私有更改为公共 . 有人可能想要明确命名迭代器类型 . )借用Yakk的回答here,您可以轻松修改它以满足您的需求 .