如果可以,可以索引到可变参数模板参数包而不进行递归。但是,GCC refusing to pick up my partial specialization在这里:
template <int I, typename List>
struct element_impl;
template <typename... TL, int... IL, typename T, int I, typename... TR, int... IR>
struct element_impl<I, typelist<pair<TL,IL>..., pair<T,I>, pair<TR,IR>...>> {
typedef T type;
};
prog.cpp:实例化“
element<0, typelist<int, double, char, float, long int> >
”:
prog.cpp:52:34:从这里实例化 prog.cpp:47:79:错误:无效使用不完整类型“struct element_impl<0, typelist<pair<int, 0>, pair<double, 1>, pair<char, 2>, pair<float, 3>, pair<long int, 4> >
”
是GCC有缺陷,还是我忽略了可变参数模板的一些限制?
答案 0 :(得分:5)
该规范称为14.8.2.5p9
如果P的表单包含
<T>
或<i>
,则相应模板参数列表Pi
的每个参数P
将与相应的参数{{1}进行比较Ai
的相应模板参数列表。如果A
的模板参数列表包含的包扩展不是最后一个模板参数,则整个模板参数列表是非推导的上下文。
不幸的是,P
符合该模式。
答案 1 :(得分:2)
AFAICT,匹配部分特化的规则与函数参数的规则类型推导相同。 §14.8.2.1/ 1说明如下:
对于在结尾处发生的函数参数包 parameter-declaration-list ,每个剩余参数的类型
A
将调用与 declarator-id 的类型P
进行比较 功能参数包。每个比较都推导出模板参数 对于扩展的模板参数包中的后续位置 功能参数包。对于功能参数包 不会出现在 parameter-declaration-list 的末尾,类型为 参数包是一个非推导的上下文。
因此,在这种情况下无法推断出包TL
和IL
,并且不会选择部分特化。