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

时间:2015-02-15 12:31:49

标签: c++ template-templates

在代码中

template < template<class TTP> class TP > ... // whatever

TTP可以在任何地方使用吗?无法找到对标准中这些名称所发生情况的任何参考。

3 个答案:

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

在此上下文中,value_tcontainer_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;的模板参数,而不是外部模板函数。