首页 文章

在std :: vector <std :: unique_ptr <T >>中迭代const T&

提问于
浏览
2

我有一个这样的课:

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

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

对于m_exprs的读者来说,能够通过const Expr&获得迭代器会很好,即迭代器会隐藏向量持有unique_ptrs的事实 . 我想这是为了与其他类保持一致,其他类将unique_ptrs保存到数据中并返回const T& .

这个接口可能类似于:

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

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

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

1 回答

  • 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

相关问题