在代码中
template < template<class TTP> class TP > ... // whatever
TTP
可以在任何地方使用吗?无法找到对标准中这些名称所发生情况的任何参考。
答案 0 :(得分:2)
[basic.scope.temp] / P1:
a的模板参数名称的声明性区域 template template-parameter 是最小的 template-parameter-list 其中引入了名称。
它可以在该列表中使用,就是这样。例如,
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;
答案 1 :(得分:1)
你可以访问它,你只需要稍微间接一点。
/--- 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
&#34;知道&#34;第一个参数,(我认为?)是你的目标。
我不是说其他答案不正确,只是你问了一些错误的问题。
要理解我已经给出的答案,可能更容易忘记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
实际上需要两个类型的args,而不是一个。无论如何,基本的想法是你必须为你希望得到它们的 这些模板args提供名称。例如。如果你有一个模板,它带有三个参数,两个类型参数和一个整数。
template< template<typename,int,typename> class the_template, typename T1, int I, typename T2>
void foo(the_template<T1,I,T2> x);
答案 2 :(得分:0)
没有。它是TP&lt;&gt;的模板参数,而不是外部模板函数。