模板模板参数参数名称用法

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 类似于 vectorlist,而 value_t 类似于 intstd::string。一旦你写了这个签名,很明显 value_t 是一个简单的类型(因此在模板介绍中变成 typename value_t)并且 container_tmpl 是一个接受(至少)一个类型参数的模板.

在此上下文中,value_tcontainer_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);