【发布时间】:2017-10-23 12:07:56
【问题描述】:
我有一个拥有std::vector 的类,应该提供begin()、end()、cbegin() 和cend() 方法。由于我不想公开实现细节,即我使用std::vector,所以我必须拥有自己的迭代器。据我了解,这就是 boost::iterator_adapter 的用途:它需要一些迭代器并将其包装在一个新的迭代器类型中 -> 我的 std::vector<T>::iterator 然后变为 MyClass::iterator。
首先,我对 boost::iterator_adapter 的理解是否正确,其次我可以避免编写第二个 const_iterator 而是例如typedef 它(using const_iterator = const iterator)?
class MyClass {
public:
iterator begin();
// ...
private:
using container_t = std::vector;
container_t<int> container;
}
class MyClass::iterator
: public boost::iterator_adaptor<
MyClass::iterator // Derived
, container_t<int>::iterator // Base
, boost::use_default // Value
, boost::random_access_traversal_tag > // CategoryOrTraversal
{
public:
iterator()
: iterator::iterator_adaptor_() {}
explicit iterator(const iterator::iterator_adaptor_::base_type& p)
: iterator::iterator_adaptor_(p) {}
private:
friend class boost::iterator_core_access;
};
这可能无法编译。
【问题讨论】:
-
你通过包装迭代器隐藏了什么,如果你只是转发“begin(),end(),cbegin()和cend()”,它不会隐藏?我不明白。如果性能在这里无关紧要,他们最简单和最灵活的方法可能只是一个 any_iterator
标签: c++ boost iterator boost-iterators