2014-09-04 80 views
1

我有一个类是这样的:迭代常量T&在一个std ::矢量<性病::的unique_ptr <T>>

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。

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

+1

是'的boost :: ptr_vector'合适的替代者? – 2014-09-04 15:16:55

+0

@ C.R。我想我可以使用ptr_vector并手动删除〜RPNExpr中的所有Exprs。我希望我能够避免使用提升并保留我的自动删除,但这似乎是一个很好的选择,如果这是不可能的,谢谢。 – TartanLlama 2014-09-04 15:24:08

+1

我认为你可以定义你自己的迭代器类,该类继承自默认的迭代器,并且在你解引用它时返回一个const T&。 – vratojr 2014-09-04 15:30:39

回答

2

有升压迭代器适配器,它做到了这一点:

#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

+0

谢谢,这很好。你甚至可以使用'typedef'来模板化一个通用的'vector 'T&'iterator。 – TartanLlama 2014-09-05 10:57:33

相关问题