如何在 "const_iterator" 到 "iterator" 之间启用转换来实现 "iterator classes"?

How can I implements "iterator classes" with enable conversion between "const_iterator" to "iterator"?

给定以下代码:

template< class T , class SIZE >
class Set {
   T* a;  
public:  
   ...
   ...
   class iterator {  
      ..
      ..
   };
   class const_iterator {  
       ..
       ..
   };
   iterator begin();
   iterator end();
   const_iterator begin() const;
   const_iterator end() const;
};

如何实现迭代器 类 以便下面的代码有效?

Set<std::string, 5> set;
Set<std::string, 5>::const_iterator it=set.begin();   

也就是说,我如何实现迭代器的 类 以便我能够将 const_iterator 转换为 iterator

您可以使用这样定义的转换构造函数:

class const_iterator {  
public: 
    const_iterator(iterator it) { /*...*/ }
};

或像这样使用转换运算符:

class iterator {  
public:
    operator const_iterator() { return const_iterator(/*...*/); }  
};

实现 iterator/const_iterator 对的最常见方法是使用如下模板:

template<typename T2>
class iterator_impl {
private:
    // iterator info
public:
    // conversion for const to non-const
    operator iterator_impl<const T2>() { return iterator_impl<const T2>(/*...*/); } 
};

// define the typedefs for const and non-const cases
typedef iterator_impl<T> iterator;
typedef iterator_impl<const T> const_iterator;

显然最后一种方法是最好的,因为你只需要实现一个迭代器函数,因为它们的区别仅在于一个是 const 而另一个不是,那么参数 T2会处理的。

注意。以上代码我没有测试过,仅供参考,但我相信它传达了这个想法。