如何让boost::iterator_adaptor迭代器的[]操作返回Node对象?
解决boost::iterator_adaptor中operator[]返回代理类的问题
这问题我之前折腾过好一会儿,boost的iterator_adaptor对随机访问迭代器的默认operator[]实现,在你的场景下会生成那个烦人的operator_brackets_proxy,咱们直接动手重载operator[]就能解决。
问题原因
你把迭代器的Reference模板参数设成了Node<T>(值类型),而不是引用类型。boost为了模拟数组访问的左值行为,会自动生成一个代理类来包装,但咱们的需求是直接返回Node<T>对象,所以默认实现不符合预期。
修改方案
在你的It类中显式重载operator[],直接通过基迭代器移动指定步数后解引用,利用你已经写好的operator*来返回Node<T>对象:
#include <iostream> #include <boost/iterator/iterator_adaptor.hpp> #include <boost/iterator/counting_iterator.hpp> template<typename T> class Node { public: explicit Node(const T index) : index_(index) {} const T index_; }; template<typename T> class It : public boost::iterator_adaptor< It<T>, // Derived boost::counting_iterator<T>, // Base Node<T>, // Value std::random_access_iterator_tag, // CategoryOrTraversal Node<T>, // Reference boost::use_default // Difference > { protected: using self_type = It<T>; using node_type = Node<T>; using difference_type = typename self_type::difference_type; // 添加类型别名简化代码 public: explicit It(const T& x) : self_type::iterator_adaptor_(x){} Node<T> operator*() const { auto& base_iterator = this->base_reference(); return Node<T>(*base_iterator); } // 显式重载operator[],绕过boost的默认代理实现 Node<T> operator[](difference_type n) const { return *(this->base() + n); } protected: friend class boost::iterator_core_access; }; int main() { It<int> a(10); std::cout << (*a).index_ << "\n"; // 现在a[4]直接返回Node<int>,可以正常访问index_了 std::cout << a[4].index_ << "\n"; // 输出14 }
关键说明
- 重载的
operator[]直接操作基迭代器:this->base()获取基迭代器的副本,移动n步后解引用,调用我们自定义的operator*返回Node<T>对象。 - 这样就完全绕过了boost生成的代理类,直接返回我们需要的对象类型,编译错误自然就消失了。
内容的提问来源于stack exchange,提问作者R zu
相关产品推荐
相关产品推荐

