模板参数与类型参数与非类型参数
在第14章(模板)中的C++标准中,它指的是具有多个不同名称的模板参数,具体取决于它们的上下文。模板参数与类型参数与非类型参数
非类型参数
template<int N>
class foo {};
模板参数
template<typename T>
class bar {};
类型参数
?????
在这下面的引用,它看起来像这些是三个不同的事情,但我不明白什么类型参数是?
14.1模板参数[temp.param]
9 ...的缺省模板参数可以用于任何种类的模板参数(类型,非类型,模板)来指定这不是模板参数包(14.5.3)。 ...
你可以在这里看到它有三个不同的模板参数名称。如果模板参数是另外两个的泛化,那么为什么将其包含在上面的列表中。
在第14.1.2它然后是指它们作为只是类型和非类型,和模板参数作为概括。
那是什么?有人可以解释吗?
在上下文中,您正在使用这种措辞,“模板参数”是类模板的参数。例如:
template<template<typename, typename> class T, typename U, int N>
struct { ... };
这里,T
是模板参数,U
是类型参数和N
是一种非类型参数。
在第14.1.2节中,它将它们称为只是类型和非类型,并将模板参数称为泛化。
这里来澄清对使用这个词“模板”是很重要的。在许多情况下,它只是用来表示那些参数是“模板”的参数(例如与函数的参数相反)。在这种情况下,这些类别分别变成“模板模板参数”,“模板类型参数”和“模板非类型参数”。
此外,在某些情况下,第一类也被认为是定义“非类型参数”,因为可以为它提供的参数不是类型(它们是模板)。因此,有时您可能会发现文字“非类型,非模板参数”严格指向第三类(即上面的N
的类别)。
另见脚注136段落的C++ 11标准的14.1/2:
由于被视为类型为了描述的目的模板模板参数和模板模板参数, 条款非类型参数和非类型变元用于指代非类型,非模板参数和变元。
它说,有三种类型模板参数的:
-
类型模板参数
template<typename T> class bar {};
-
非类型模板参数
template<int N> class foo {};
-
模板模板参数
template<template<class> class T> class baz {};
我不过同意这是不好界定。在语法中,以template
开头的模板参数是类型参数的可能产生之一。
+1找到该脚注。 – 2013-03-12 19:02:08