假设我有以下定义
template <class T>
class Sequence
{
}
E.g
Sequence<string>
可能是一个字符串数组,类似于vector<string>
// Now define iterator template
template <class T>
class SequenceIterator
{
}
这里的想法当然是能够在某个序列上创建迭代器 E.g。
SequenceIterator< Sequence<string> > iter1;
SequenceIterator< Sequence<int> > iter2;
我现在的问题是如何定义SequenceIterator中存在的成员函数,其目的是返回序列中的下一个值。通常我希望将其写为
bool Next(T1 & value); // If the iterator has not finished, set value to the next item
但是,SequenceIterator
已经以模板名称传递,即Sequence<string>
或Sequence<int>
所以问题是,我如何一般性地引用底层类型(string
或int
),以便我可以定义Next成员函数。
谢谢, 大卫
答案 0 :(得分:2)
标准库通过在每个容器中包含typedef来解决这个问题。在这种情况下,Sequence<T>
会有typedef T value_type;
,因此您可以使用Sequence<T>::value_type
来引用该类型。
另外,我会高度考虑像标准库一样使用operator++
和operator*
,这样就不会让人们混淆非标准的迭代器接口。
答案 1 :(得分:2)
有三种方法:将Sequence
的定义更改为包含
typedef T type;
或更改SequenceIterator
的模板参数,以明确识别Sequence
本身就是模板
template< template < class > class Seq, class T >
class SequenceIterator< Seq< T > >
虽然SequenceIterator
的实例化没有变化,但您现在可以直接访问T
。第三,您可以使用container traits class来处理类型扣除。第三个选项提供Sequence
和SequenceIterator
之间的最小耦合,但是,与Mark said一样,standard containers倾向于使用第一种方法。