(是的,由于我的穷人英语,标题太奇怪了;我希望有人可以改进它。)
回答this question,我发现此代码有效:
template <typename T1, typename T2> class A { };
template <template <typename...> class U> class B { };
int main()
{
B<A> it_works;
}
..虽然template <typename...> class
和template <typename, typename> class
不相等。
我试图弄清楚为什么有可能并观看N3337 standard的[temp.param],但我找不到任何东西。怎么可能?
答案 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中的零个或多个模板参数或模板参数包具有与P
中的模板参数包相同类型和形式的A的em>
其中P是参数(示例中为U
),A是参数(示例中为A
)。因此,仅使用参数包的示例将使模板与任意数量的类型参数匹配。