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

Iterating over const T& in a std::vector<std::unique_ptr<T> >

本文关键字:std lt gt const 迭代 unique vector ptr      更新时间:2023-10-16

我有一个这样的类:

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;
};

然后,消费者应该能够通过使用标准迭代器运算符对Expr进行迭代。

有什么好方法吗?我应该写一个对指针进行抽象的向量包装器吗?我应该根本不这样做,并在向量中使用unique_ptrs以外的东西吗?

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