C++14下如何将带next()方法的类迭代器转换为兼容STL的begin/end迭代器对
问题背景
接手的代码库中存在一个类迭代器结构,以下为简化逻辑代码(非线上实际运行代码):
template <class T> struct IteratorLike { T* next() &; // 要么返回指向有效元素的指针,要么返回空指针 };
该类的使用方式与Rust迭代器高度相似:
IteratorLike<...> it = ...; while(auto* item = it.next()) { do_something(*item); }
转换目标
需要将该类迭代器转换为兼容C范围for循环、STL算法或range-v3的标准迭代器对。当前使用C14标准(具体版本为gcc5.5),因此无法使用与迭代器本身类型不同的哨兵类型。
现有实现尝试
目前尝试的最简方案是在包装类中同时存储原始类迭代器和下一个待访问元素:
template <class T> class MyIterator { private: IteratorLike<T> m_iter; T* m_value; public: using value_type = T; using difference_type = std::ptrdiff_t; using pointer = T*; using reference = T&; using iterator_category = std::input_iterator_tag; reference operator*() const { assert(m_value && "trying to read past the end of the iterator"); return *m_value; } pointer operator->() { // 不确定这里是否需要加断言 assert(m_value && "trying to read past the end of the iterator"); return m_value; } // 前缀自增 MyIterator& operator++() { m_value = m_iter.next(); return *this; } // 后缀自增 MyIterator operator++(int) { MyIterator tmp = *this; ++(*this); return tmp; } // 供`my_collection.begin()`调用 explicit MyIterator(IteratorLike<T> iter) : m_iter{m_iter} , m_value{this->self.next()} {} // 缺少operator ==、operator !=以及供`my_collection.end()`调用的构造函数 };
当前存在的问题
- 无法明确
my_collection.end()应该返回什么,经确认无法对m_iter进行默认初始化 - 不知道如何实现有实际意义的迭代器比较运算符
补充说明:当前操作本质是公开技术文章中提到的「使用std::optional实现迭代器与范围替代设计」方案的反向实现。
内容的提问来源于stack exchange,提问作者Robin
相关产品推荐
相关产品推荐

