给出以下代码:
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
?
答案 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
将照顾到这一点。
请注意。我还没有对上面的代码进行测试,它仅用于查看目的,但我相信它传达了这个想法。