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

How can you use the types defined in a template in C++?

本文关键字:定义 类型 C++      更新时间:2023-10-16

给定一个模板类:

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

可以列出类的列表,例如

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

我正试图使用上面的列表来创建一个模板类,它只处理列表中的类。在上面的例子中,我的类将处理int、string和short(例如,将它们打印到控制台)。

我已经为此挣扎了一段时间,我甚至不知道从哪里开始。任何以开头的代码

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应该是一个类,对吧?我该如何利用这些信息?

.运算符访问对象的成员。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;
}

然而,一旦你开始考虑列表的尾部,你(可能)就会需要这个类。