make iterator dereference对象

时间:2014-08-20 13:58:10

标签: c++

我有一个简单的容器类,例如:

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
}

有没有一种简单的方法可以让迭代器自动取消引用,或者我是否需要编写一个具有该行为的新迭代器?

2 个答案:

答案 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_;

在这种情况下,您不需要取消引用项目对象。