我可以使用foo <t ...,int,=“”u ... =“”>这样的模式对模板进行部分特化吗?</t ...,>

时间:2012-06-17 17:37:39

标签: c++ templates c++11 variadic-templates

如果可以,可以索引到可变参数模板参数包而不进行递归。但是,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有缺陷,还是我忽略了可变参数模板的一些限制?

2 个答案:

答案 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 的末尾,类型为   参数包是一个非推导的上下文。

因此,在这种情况下无法推断出包TLIL,并且不会选择部分特化。