If this is possible, one can index into a variadic template parameter pack without recursion. However, GCC is refusing to pick up my partial specialization here:
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: In instantiation of '
element<0, typelist<int, double, char, float, long int> >':
prog.cpp:52:34: instantiated from here
prog.cpp:47:79: error: invalid use of incomplete type 'struct element_impl<0, typelist<pair<int, 0>, pair<double, 1>, pair<char, 2>, pair<float, 3>, pair<long int, 4> >'
Is GCC buggy, or am I ignoring some limitation of variadic templates?
The spec says at 14.8.2.5p9
If P has a form that contains
<T>or<i>, then each argumentPiof the respective template argument listPis compared with the corresponding argumentAiof the corresponding template argument list ofA. If the template argument list ofPcontains a pack expansion that is not the last template argument, the entire template argument list is a non-deduced context.
Your typelist<T> unfortunately matches that pattern.
AFAICT, the rules for matching partial specializations are the same as the rules type deduction of function parameters. And §14.8.2.1/1 says the following:
For a function parameter pack that occurs at the end of the parameter-declaration-list, the type
Aof each remaining argument of the call is compared with the typePof the declarator-id of the function parameter pack. Each comparison deduces template arguments for subsequent positions in the template parameter packs expanded by the function parameter pack. For a function parameter pack that does not occur at the end of the parameter-declaration-list, the type of the parameter pack is a non-deduced context.
So the packs TL and IL cannot be deduced in this case, and the partial specialization is not picked.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With