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

ikh*_*ikh 6 c++ templates language-lawyer c++11

(是的,由于我的英语不好,标题很奇怪;我希望有人能改进它.)

回答这个问题,我发现这段代码有效:

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

int main()
{
    B<A> it_works;
}
Run Code Online (Sandbox Code Playgroud)

..尽管template <typename...> classtemplate <typename, typename> class不平等.

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

Rei*_*ica 5

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

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

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
Run Code Online (Sandbox Code Playgroud)

- 末端的例子 ]

(强调我的)


Mik*_*our 3

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

\n\n
\n

当 P\xe2\x80\x99s template-parameter-list包含模板参数包时,该模板参数包将匹配 A 的template-parameter-list中零个或多个具有相同类型和形式的模板参数或模板参数包:P中的模板参数包

\n
\n\n

其中 P 是参数(U在您的示例中),A 是参数(A在您的示例中)。因此,您的示例(仅包含参数包)将与具有任意数量类型参数的模板相匹配。

\n