可变参数模板是否可以匹配非可变参数模板参数?

sba*_*bbi 5 c++ templates variadic template-meta-programming c++11

请考虑以下代码段:

template<template<class> class T,class U>
struct apply
{
     typedef T<U> type;
};

typedef apply<std::tuple,int>::type tuple_of_one_int; //Should be std::tuple<int>
Run Code Online (Sandbox Code Playgroud)

GCC 4.8.2.说:

type/value mismatch at argument 1 in template parameter list for [...] struct apply
expected a template of type ‘template<class> class T’, got ‘template<class ...> class std::tuple’
Run Code Online (Sandbox Code Playgroud)

这基本上意味着类std::tuple变量模板不是Tin 的有效模板参数apply.

这是一个GCC错误还是标准要求这种行为?

aar*_*man 5

有人纠正我,如果我错了,但从这句话看起来似乎是正确的:

3当template-argument的相应类模板或[FI 11]模板别名模板(称为A)的template-parameter-list中的每个模板参数时,template-argument与模板模板参数(称为P)匹配匹配P的template-parameter-list中的相应模板参数

A(给定的模板)必须将每个模板参数P与模板模板相匹配.

从本节的第二部分我们了解到限制不适用于反向,这意味着包含参数包的模板模板可以匹配任何内容.

当P的template-parameter-list包含模板参数包(14.5.3)时,模板参数包将匹配A的模板参数列表中的零个或多个模板参数或模板参数包,其类型和形式与P中的模板参数包

你可能已经知道让它工作的方法是

template<template<class> class T,class U>                                       
struct apply                                                                       
{                                                                                  
         typedef T<U> type;                                                        
};                                                                                 

template<class T> using tuple_type  = std::tuple<T>;
typedef apply<tuple_type,int>::type tuple_of_one_int;                          
Run Code Online (Sandbox Code Playgroud)

c ++ 11标准也有一个与你相同的例子.

template <class ... Types> class C { /? ... ?/ };

template<template<class> class P> class X { /? ... ?/ };

X<C> xc; //ill-formed: a template parameter pack does not match a template parameter  
Run Code Online (Sandbox Code Playgroud)

最后的评论完全描述了你的情况,在这种情况下,类C将相当于std::tuple.