我有一堂这样的课:
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 以外的其他东西?
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; }
Source: http://www.boost.org/doc/libs/1_56_0/libs/iterator/doc/indirect_iterator.html http://www.boost.org/doc/libs/1_56_0/libs/iterator/doc/indirect_iterator.html
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)