在第14章(模板)中的C ++标准中,它引用了具有多个不同名称的模板参数,具体取决于它们的上下文。
非类型参数
template<int N>
class foo {};
模板参数
template<typename T>
class bar {};
型参数
?????
在下面的引文中,它看起来好像是三个不同的东西,但是我无法弄清楚 type-parameter 是什么?
14.1模板参数[temp.param]
9 ...可以为任何非模板参数包的模板参数(类型,非类型,模板)指定默认模板参数(14.5.3) 。 ...
您可以在此处看到它有三个不同的模板参数名称。如果 template-parameter 是对其他两个的概括,那么为什么要在上面的列表中包含它。
在第14.1.2节中,它将它们称为 type 和 non-type ,并将template-parameter称为泛化。
那是什么?谁能解释一下?
答案 0 :(得分:7)
它说有三种类型的模板参数:
输入模板参数
template<typename T>
class bar {};
非类型模板参数
template<int N>
class foo {};
模板模板参数
template<template<class> class T>
class baz {};
但我确实认为这个定义不明确。在语法中,以template
开头的模板参数是 type-parameter 的可能产生之一。
答案 1 :(得分:5)
在您使用此措辞的上下文中,“模板参数”是类模板的参数。例如:
template<template<typename, typename> class T, typename U, int N>
struct { ... };
此处,T
是模板参数,U
是类型参数,N
是非类型参数。
在第14.1.2节中,它将它们称为type和non-type,将template-parameter称为泛化。
重要的是消除“模板”一词的使用歧义。在许多情况下,它仅用于表示那些是“模板”的参数(例如,与函数的参数相对)。在这种情况下,这些类别(分别)成为“模板模板参数”,“模板类型参数”和“模板非类型参数 ”
此外,在某些情况下,第一类也被认为是定义“非类型参数”,因为可以为其提供的参数不是类型(它们是模板)。因此,有时您可能会发现“非类型,非模板参数”的措辞严格指代第三类(即上面的N
类别)。
另见C ++ 11标准第14.1 / 2段脚注136:
由于模板模板参数和模板模板参数被视为用于描述目的的类型, 术语非类型参数和非类型参数用于引用非类型,非模板参数和参数。