我如何实现"迭代器类"在" const_iterator"之间启用转换to" iterator"?

时间:2018-06-14 19:23:15

标签: c++11 iterator const-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

1 个答案:

答案 0 :(得分:2)

您可以使用如此定义的转换构造函数:

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将照顾到这一点。

请注意。我还没有对上面的代码进行测试,它仅用于查看目的,但我相信它传达了这个想法。