如何在 "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
会处理的。
注意。以上代码我没有测试过,仅供参考,但我相信它传达了这个想法。
给定以下代码:
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
会处理的。
注意。以上代码我没有测试过,仅供参考,但我相信它传达了这个想法。