Template 模板参数背后的 C++ 基本原理

C++ rationale behind Template template arguments

这不是关于模板语法含义的问题,而是关于为什么 C++ 标准委员会选择这种语法的问题。让我们举个例子,

(1)

template< typename T> 
Class A
{
...
}

以上是 class 模板语法的语法,只有一个模板参数。我可以理解这个语法是c++委员会可以任意选择的。

(2)

template<template <typename> typename T>
class B
{
...
} 

C++ 标准委员会应该使用 (1) 和一些语言标准/语法构建 (2) 语法。我无法理解 (2) 是如何使用 (1) 构建的。

如果有选择,我会选择下面的模板语法,

(3)

template <typename template< typename T>> //my way of writing syntax (but not recognized by standard)

上面的内部template<typename T>是一个模板数据类型,所以它的模板应该写成template<typename template<typename T>>

谁能解释为什么语言委员会选择了 (2) 而不是 (3)

有一个类似的问题Syntax of C++ Template Template Parameters没有阐明这些

一步步分解,还是有道理的。如果我们从模板化结构的声明开始 T:

template <typename U>
struct T;

如果我们有一个 class B 这是一个模板:

template <typename T>
struct B;

如果我们用上面的声明替换 typename T

template <template <typename U> struct T>
struct B;

struct替换为typename:

template <template <typename U> typename T>
struct B;

然后我们只需要删除U(虽然你不必,你可以把它留在里面,它只是没有意义)我们得到:

template <template <typename> typename T>
struct B;

你的语法:

template <typename template<typename T>>

意味着 T 是内部模板的参数类型(在我的例子中是 U )而不是外部模板类型,这会更有意义,不会太远来自标准:

template <typename template<typename> T>