我有一个简单的容器类,例如:
class SimpleContainer {
using iterator = std::vector<Contained*>::iterator;
std::vector<Contained*> items_; // Note that 'Contained' is polymorphic.
public:
iterator begin() { return items_.begin(); }
iterator end() { return items_.end(); }
};
够容易。但是当我在一个for
循环中使用它时,我必须手动取消引用该项,如:
SimpleContainer container;
for (auto item : container) {
cout << *item << endl; // Dereferencing here is ugly
}
有没有一种简单的方法可以让迭代器自动取消引用,或者我是否需要编写一个具有该行为的新迭代器?
答案 0 :(得分:3)
如果使用boost是可以接受的,则仅为此目的创建indirect_iterator
。使用
using iterator = boost::indirect_iterator<std::vector<Contained*>::iterator>;
然后,您需要使用
修改begin()
和end()
iterator begin() { return boost::make_indirect_iterator(items_.begin(); }
http://www.boost.org/doc/libs/1_56_0/libs/iterator/doc/indirect_iterator.html
的更多详情答案 1 :(得分:-1)
您确定需要在容器中存储指针吗?我会像这样实现你的代码:
std::vector<Contained> items_;
在这种情况下,您不需要取消引用项目对象。