C ++ 11:是否可以将固定模板参数模板提供给variadic-template-template-parameter?

时间:2014-09-26 12:58:12

标签: c++ templates c++11 language-lawyer

(是的,由于我的穷人英语,标题太奇怪了;我希望有人可以改进它。)

回答this question,我发现此代码有效:

template <typename T1, typename T2> class A { };
template <template <typename...> class U> class B { };

int main()
{
    B<A> it_works;
}

..虽然template <typename...> classtemplate <typename, typename> class不相等。

我试图弄清楚为什么有可能并观看N3337 standard的[temp.param],但我找不到任何东西。怎么可能?

2 个答案:

答案 0 :(得分:5)

是的,有可能这样做。 C ++ 11 14.3.3 / 3特别允许它,并提供了一个例子。

  

3 template-argument 匹配模板 template-parameter (称之为P)每个模板参数   在 template-argument template-parameter-list 中对应的类模板或别名模板(调用   它A)匹配P template-parameter-list 中的相应模板参数。 P template-parameter-list 包含模板参数包(14.5.3)时,模板参数包将匹配为零   A template-parameter-list 中的更多模板参数或模板参数包   与P中的模板参数包相同的类型和形式(忽略这些模板参数是否为   模板参数包) [示例:

template <class T> struct eval;

template <template <class, class...> class TT, class T1, class... Rest>
struct eval<TT<T1, Rest...>> { };

template <class T1> struct A;
template <class T1, class T2> struct B;
template <int N> struct C;
template <class T1, int N> struct D;
template <class T1, class T2, int N = 17> struct E;

eval<A<int>> eA; // OK: matches partial specialization of eval
eval<B<int, float>> eB; // OK: matches partial specialization of eval
eval<C<17>> eC; // error: C does not match TT in partial specialization
eval<D<int, 17>> eD; // error: D does not match TT in partial specialization
eval<E<int, float>> eE; // error: E does not match TT in partial specialization
     

- 示例]

(强调我的)

答案 1 :(得分:3)

[temp.arg.template]描述模板模板参数如何与相应参数匹配。特别是,C ++ 11 14.3.3 / 3说

  

当P的 template-parameter-list 包含模板参数包时,模板参数包将匹配 template-parameter-list中的零个或多个模板参数或模板参数包中的模板参数包相同类型和形式的A的em>

其中P是参数(示例中为U),A是参数(示例中为A)。因此,仅使用参数包的示例将使模板与任意数量的类型参数匹配。