我有一堂这样的课:
class RPNExpr
{
std::vector<std::unique_ptr<Expr> > m_exprs;
};
m_exprs 的每个元素都由构建器函数进行堆分配,应该可以被其他类读取,但纯粹由 RPNExpr 所有,并且应该在 RPNExpr 超出范围时被销毁。
如果 m_exprs 的读者能够获得 const Expr& 上的迭代器,即隐藏 vector 持有 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。
有什么好的方法可以做到这一点吗?我应该编写一个抽象指针的 vector 包装器吗?我是否应该根本不这样做并在 vector 中使用 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
关于c++ - 在 std::vector<std::unique_ptr<T>> 中迭代 const T&,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25669120/