2013-03-12 182 views
3

在第14章(模板)中的C++标准中,它指的是具有多个不同名称的模板参数,具体取决于它们的上下文。模板参数与类型参数与非类型参数

非类型参数

template<int N> 
class foo {}; 

模板参数

template<typename T> 
class bar {}; 

类型参数

????? 

在这下面的引用,它看起来像这些是三个不同的事情,但我不明白什么类型参数是?

14.1模板参数[temp.param]

9 ...的缺省模板参数可以用于任何种类的模板参数(类型,非类型,模板)来指定这不是模板参数包(14.5.3)。 ...

你可以在这里看到它有三个不同的模板参数名称。如果模板参数是另外两个的泛化,那么为什么将其包含在上面的列表中。

在第14.1.2它然后是指它们作为只是类型非类型,和模板参数作为概括。

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

回答

4

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

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

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

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

这里来澄清对使用这个词“模板”是很重要的。在许多情况下,它只是用来表示那些参数是“模板”的参数(例如与函数的参数相反)。在这种情况下,这些类别分别变成“模板模板参数”,“模板类型参数”和“模板非类型参数”。

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

另见脚注136段落的C++ 11标准的14.1/2:

由于被视为类型为了描述的目的模板模板参数模板模板参数, 条款非类型参数非类型变元用于指代非类型,非模板参数和变元。

+0

+1找到该脚注。 – 2013-03-12 19:02:08

5

它说,有三种类型模板参数的:

  1. 类型模板参数

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

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

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

我不过同意这是不好界定。在语法中,以template开头的模板参数类型参数的可能产生之一。