模板模板参数参数名称用法
Template template parameter argument names usage
代码中
template < template<class TTP> class TP > ... // whatever
TTP
可以在任何地方使用吗?在标准中找不到关于这些名称所发生情况的任何参考。
没有。它是 TP<> 的模板参数,而不是外部模板函数。
[basic.scope.temp]/p1:
The declarative region of the name of a template parameter of a
template template-parameter is the smallest template-parameter-list
in which the name was introduced.
它可以在该列表中使用,仅此而已。例如,
template < template<class T, T t> class TP > class foo {};
// ^ ^-----T's scope ends here
// |
// T can be used here
foo<std::integral_constant> bar;
你可以访问它,你只需要稍微间接一点。
/--- don't bother giving this a name.
|
| Put it here instead ------------------\ |
| |
V V
template<template<typename, typename ...> class container_tmpl, typename value_t>
void foo(container_tmpl<value_t> x) {
std:: cout << __PRETTY_FUNCTION__ << std:: endl;
}
更准确地说,如果你有一个vector<int>
类型的对象,并且你将它传递给上面的foo
,那么foo
就可以访问相关的类型参数:
vector<int> v;
bar(v);
当调用 bar(v)
时,bar
"knows" 第一个参数,这(我认为?)是你的目标。
我不是说其他答案不正确,只是你问的问题有点错误。
要理解我给出的答案,忘记 template
行并查看:
可能更容易
/* complex template-template gibberish */
void foo(container_tmpl<value_t> x) {
x
的类型,foo
的参数,是 container_tmpl<value_t>
类型。其中 container_tmpl
类似于 vector
或 list
,而 value_t
类似于 int
或 std::string
。一旦你写了这个签名,很明显 value_t
是一个简单的类型(因此在模板介绍中变成 typename value_t
)并且 container_tmpl
是一个接受(至少)一个类型参数的模板.
在此上下文中,value_t
和 container_tmpl
定义在 bar
内。
如果你不明白为什么我有 typename ...
,请记住 vector
实际上有两个类型参数,而不是一个。无论如何,基本思想是您必须为这些模板参数 outside 提供您希望获得它们的名称。例如。如果您的模板采用三个参数、两个类型参数和一个整数。
template< template<typename,int,typename> class the_template, typename T1, int I, typename T2>
void foo(the_template<T1,I,T2> x);
代码中
template < template<class TTP> class TP > ... // whatever
TTP
可以在任何地方使用吗?在标准中找不到关于这些名称所发生情况的任何参考。
没有。它是 TP<> 的模板参数,而不是外部模板函数。
[basic.scope.temp]/p1:
The declarative region of the name of a template parameter of a template template-parameter is the smallest template-parameter-list in which the name was introduced.
它可以在该列表中使用,仅此而已。例如,
template < template<class T, T t> class TP > class foo {};
// ^ ^-----T's scope ends here
// |
// T can be used here
foo<std::integral_constant> bar;
你可以访问它,你只需要稍微间接一点。
/--- don't bother giving this a name.
|
| Put it here instead ------------------\ |
| |
V V
template<template<typename, typename ...> class container_tmpl, typename value_t>
void foo(container_tmpl<value_t> x) {
std:: cout << __PRETTY_FUNCTION__ << std:: endl;
}
更准确地说,如果你有一个vector<int>
类型的对象,并且你将它传递给上面的foo
,那么foo
就可以访问相关的类型参数:
vector<int> v;
bar(v);
当调用 bar(v)
时,bar
"knows" 第一个参数,这(我认为?)是你的目标。
我不是说其他答案不正确,只是你问的问题有点错误。
要理解我给出的答案,忘记 template
行并查看:
/* complex template-template gibberish */
void foo(container_tmpl<value_t> x) {
x
的类型,foo
的参数,是 container_tmpl<value_t>
类型。其中 container_tmpl
类似于 vector
或 list
,而 value_t
类似于 int
或 std::string
。一旦你写了这个签名,很明显 value_t
是一个简单的类型(因此在模板介绍中变成 typename value_t
)并且 container_tmpl
是一个接受(至少)一个类型参数的模板.
在此上下文中,value_t
和 container_tmpl
定义在 bar
内。
如果你不明白为什么我有 typename ...
,请记住 vector
实际上有两个类型参数,而不是一个。无论如何,基本思想是您必须为这些模板参数 outside 提供您希望获得它们的名称。例如。如果您的模板采用三个参数、两个类型参数和一个整数。
template< template<typename,int,typename> class the_template, typename T1, int I, typename T2>
void foo(the_template<T1,I,T2> x);