6

如果这是可能的,可以在不递归的情况下索引可变参数模板参数包。但是,GCC拒绝在这里接受我的部分专业化:

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 有问题,还是我忽略了可变参数模板的一些限制?

4

2 回答 2

5

规范说在 14.8.2.5p9

如果 P 具有包含<T>or的形式<i>,则将相应模板参数列表的每个参数Pi与 的相应模板参数列表P的相应参数Ai进行比较A。如果模板参数列表P包含不是最后一个模板参数的包扩展,则整个模板参数列表是非推导上下文。

typelist<T>不幸的是,您与该模式匹配。

于 2012-06-17T18:35:30.030 回答
2

AFAICT,匹配偏特化的规则与函数参数的规则类型推导相同。§14.8.2.1/1 说如下:

对于出现在 parameter-declaration-listA末尾的函数参数包,将调用的每个剩余参数的类型与函数参数包Pdeclarator-id的类型进行比较。每个比较推导出模板参数包中由函数参数包扩展的后续位置的模板参数。对于没有出现在parameter-declaration-list末尾的函数参数包,参数包的类型是非推导上下文。

因此,在这种情况下无法推断出包TL和,并且不选择部分专业化。IL

于 2012-06-17T18:15:55.567 回答