我有一个这样的课:
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 回答
在boost中有一个迭代器适配器可以做到这一点:
资料来源:http://www.boost.org/doc/libs/1_56_0/libs/iterator/doc/indirect_iterator.html