如何在C ++中使用模板中定义的类型?

时间:2014-09-27 05:35:24

标签: c++ templates types

给出模板类:

template<class T, class U>
  struct myList {
    typedef T head;
    typedef U next;
  };

class nullList {};

可以列出类,例如

myList<int, myList<string, myList<short, nullList> > >;

我正在尝试使用上面的列表来创建一个只处理列表中的类的模板类。在上面的例子中,我的类将处理整数,字符串和短路(例如将它们打印到控制台)。

我一直在努力解决这个问题,我甚至还不确定从哪里开始。任何以

开头的代码
template<class T, class U>
class myClass {
    ...
};

失败,因为myClass只接受一个模板参数,即myList,即

myClass<myList>

但如果我尝试使用

template<typename l>
class myClass {
   l.head foo;// cannot refer to type member 'head' in 'myList<int, nullList>' with '.'
}

技术上myList.head应该是一个类,对吧?我该如何利用这些信息?

1 个答案:

答案 0 :(得分:2)

.运算符访问对象的成员l不是一个对象 - 它是一个类。要访问类的静态成员,请使用::运算符。如果您要访问的成员是某种类型,而您正在访问该成员的类是模板参数,则出于语法原因,您还需要typename关键字。所以你变成了:

template<typename l>
class myClass {
    typename l::head foo;
}

如果您只想打印给定类型的值并且您对创建具有该类型成员的对象不感兴趣,则可以定义一个以类型为参数的静态函数:

template<typename l>
class myClass {
  public:
    static void print(typename l::head foo) {
        std::cout << foo << std::endl;
    }
};

事实上,在这种情况下,你只考虑列表的头部,你根本不需要一个课程,而且可以这样做:

template<typename l>
void print(typename l::head foo) {
    std::cout << foo << std::endl;
}

然而,一旦你开始考虑列表的尾部,你(可能)就需要上课。