如何在C++中使用模板中定义的类型
How can you use the types defined in a template in C++?
给定一个模板类:
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;
}
然而,一旦你开始考虑列表的尾部,你(可能)就会需要这个类。
相关文章:
- 使用QJsEngine在Qt中注册自定义类型
- 在UE4中使用未定义类型'UTextBlock'
- 修改"std::set"中用户定义类型的值
- 当我使用自定义类型创建动态数组时,即使使用字符串,它似乎也不起作用
- QtQuick - qml:28:错误:未知方法返回类型:自定义类型
- 如何使自定义类型在unordered_map中用作键
- 在 C++20 中是否不再允许在 std 中对程序定义类型的函数模板进行专用化?
- Qt5 远程对象 + 自定义类型,但不在 POD 中
- 为什么转换函数声明不需要至少一个定义类型说明符
- 标准::原子中的自定义类型
- 如何使用自定义类型声明Arduino数组?
- 如何在 Cython 中定义返回 cpp 定义类型的函数?
- 使用自定义访问者时具有自定义类型的提升变体失败(源自 boost::static_visitor)
- 您可以将binary_search应用于具有自定义类型的矢量吗?
- 在自定义类型图中重用 SWIG 映射
- 扩展自定义类型的spdlog
- vim使用户定义类型的COLOR与C++中的基本类型相同
- 重载自定义类型的 std::to_string 和 std::to_chars?
- 具有未声明/未定义类型的 typedef 结构
- 函数重载:内置类型与用户定义类型