4

在第 14 章(模板)的 C++ 标准中,它引用了具有多个不同名称的模板参数,具体取决于它们的上下文。

非类型参数

 template<int N>
 class foo {};

模板参数

template<typename T>
class bar {};

类型参数

 ?????

在下面的引用中,这看起来像是三个不同的东西,但是我不知道什么是类型参数

14.1 模板参数[temp.param]

9 ... 可以为不是模板参数包 (14.5.3)的任何类型的模板参数(类型、非类型、模板)指定默认模板参数。...

您可以在此处看到它具有三个不同的模板参数名称。如果模板参数是其他两个的概括,那么为什么将其包含在上面的列表中。

然后在第 14.1.2 节中将它们称为typenon-type,并将模板参数称为泛化。

那是什么?有人可以解释吗?

4

2 回答 2

7

据说模板参数有三种类型:

  1. 类型模板参数

    template<typename T>
    class bar {};
    
  2. 非类型模板参数

    template<int N>
    class foo {};
    
  3. 模板模板参数

    template<template<class> class T>
    class baz {};
    

但是,我确实同意这是定义错误的。在语法中,以开头的模板参数是type-parametertemplate的可能产生之一。

于 2013-03-12T18:49:58.123 回答
5

在您使用此措辞的上下文中,“模板参数”是类模板的参数。例如:

template<template<typename, typename> class T, typename U, int N>
struct { ... };

这里,T模板参数U类型参数N是非类型参数。

然后在第 14.1.2 节中将它们称为类型和非类型,并将模板参数称为泛化。

这里重要的是消除“模板”一词的使用歧义。在许多情况下,它仅用于表示这些是“模板”的参数(例如,与函数的参数相反)。在这种情况下,这些类别(分别)成为“模板模板参数”、“模板类型参数”和“模板非类型参数”。

此外,在某些情况下,第一类也被认为定义了“非类型参数”,因为可以为其提供的参数不是类型(它们是模板)。因此,有时您可能会发现“非类型、非模板参数”一词严格指第三类(即上述类别N)。

另请参阅 C++11 标准第 14.1/2 段的脚注 136:

由于模板模板参数模板模板参数被视为用于描述目的的类型,因此术语非类型参数非类型参数用于指代非类型、非模板参数和参数。

于 2013-03-12T18:50:13.253 回答