迭代const T&amp;在std :: vector <std :: unique_ptr <t>&gt; </std :: unique_ptr <t>

时间:2014-09-04 15:14:13

标签: c++ c++11 vector iterator unique-ptr

我有一个这样的课程:

class RPNExpr
{
    std::vector<std::unique_ptr<Expr> > m_exprs;
};

m_exprs的每个元素由构建器函数进行堆分配,应该可由其他类读取,但纯粹由RPNExpr拥有,并且当RPNExpr超出范围时应该被破坏。

m_exprs的读者能够通过const Expr&amp;获得一个迭代器,即一个隐藏向量保持unique_ptrs这一事实的迭代器,这将是一件好事。我希望这是为了与其他类保持一致,其他类将unique_ptrs保存到他们的数据并返回const T&amp;他们。

此界面可能如下所示:

class RPNExpr
{
public:
    SomeIterator expr_begin();
    SomeIterator expr_end();
private:
    std::vector<std::unique_ptr<Expr> > m_exprs;
};

然后,消费者应该能够使用标准迭代器运算符迭代Exprs。

有一个很好的方法吗?我应该编写一个抽象指针的矢量包装器吗?我根本不应该这样做,并在我的向量中使用除unique_ptrs之外的东西吗?

1 个答案:

答案 0 :(得分:3)

在boost中有一个迭代器适配器就是这样:

#include <boost/iterator/indirect_iterator.hpp>
...
using ExprIterator = boost::indirect_iterator<std::vector<std::unique_ptr<Expr>>::iterator>;
ExprIterator expr_begin() { return std::begin(m_exprs); }
ExprIterator expr_end() { return std::end(m_exprs; }

来源:http://www.boost.org/doc/libs/1_56_0/libs/iterator/doc/indirect_iterator.html