如何在嵌套模板中引用参数参数的类型?

时间:2011-04-01 03:11:26

标签: c++ templates types

假设我有以下定义

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>

所以问题是,我如何一般性地引用底层类型(stringint),以便我可以定义Next成员函数。

谢谢, 大卫

2 个答案:

答案 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来处理类型扣除。第三个选项提供SequenceSequenceIterator之间的最小耦合,但是,与Mark said一样,standard containers倾向于使用第一种方法。