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>
这不是关于模板语法含义的问题,而是关于为什么 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>