我对 C++ 模板有些困惑。
考虑以下模板:
template<class TYPE>
void function(TYPE data)
并且。
template<typename TYPE>
void function(TYPE data)
我感到困惑的是,typename 和 class 作为变量标识符或类型之间的区别是什么。
为了指定(类型)模板参数,它们两者完全相同,就像 int
/signed int
或者 &&
/and
一样: template <typename>
/template <class>
。
到C++14为止,模板模板参数存在一个奇特的限制:
template <template <typename> class Tmpl> struct Foo;
// ^^^^^
只有关键字class
可以用来指定模板模板参数。
在C++14之后,你可以在任何地方一致地使用 class
或 typename
:
template <template <typename> typename Tmpl> struct Foo;
class
比typename
短3个字母。 - Yakk - Adam Nevraumonttemplate
中声明类型时,class
比typename
短3个字母的事实是使用这两者之间最重要的区别。 简化37%的样板代码非常重要! - Yakk - Adam Nevraumont这两者之间确实有区别。
class
定义一个类,因此如果您想将模板化的类定义为模板参数,则必须使用它。
例如,您可以定义一个接收模板化类类型的模板:
template <class A>
class Blah
{
};
template <template <class , class> class T, class A, class B>
class Blah<T<A,B>>
{
};
int _tmain(int argc, _TCHAR* argv[])
{
Blah<std::vector<int>> a;
return 0;
}
你不能使用typename
这样声明一个模板类。
typename
也被用作一个关键字来访问依赖的模板名字。
temlate<template<class,class>typename Z, class A, class B>
将是合法的,并且与 template<template<class,class>class Z, class A, class B>
的意义相同。句子“class
定义了一个类,所以如果你想定义…” 有一个真正的结论和前提,但两者只有模糊的联系。;) 的确,非类模板的引入是 class
关键字在此处要求被删除的原因,但它们并不是同时发生的! - Yakk - Adam Nevraumont