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

给定一个模板类:

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

class nullList {};

可以列出类别,例如

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

我正在尝试使用上面的列表来制作仅处理列表中的类的模板类。在上面的示例中,我的班级将处理int,字符串和短裤(例如,将它们打印到控制台)。

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

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

sepp2k

.操作者访问的成员对象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;
}

但是,一旦开始考虑列表的尾部,您(可能)将需要该类。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章