You can pack them in tuple or in an arbitrary empty template template (I prefer to call it pack ):
template<typename... Args> struct pack { }; template<class T, class... Args> struct A { using args = pack<Args...>; };
If you are then given A , for example. in the function template and you want to output Args... , you can do it like this:
template<typename... Args, typename A> void f(pack<Args...>, A a) { } template<typename A> void f(A a) { f(typename A::args(), a); }
pack is empty, convenient in such situations. Otherwise, you will need another means to pass args without actually passing a tuple containing the data (for example, transferring it to another empty structure).
Or in class template specialization:
template<typename T, typename = typename T::args> struct B_impl; template<typename T, typename... Args> struct B_impl <T, pack<Args...> > {
I think these are the deduction and partial specialization options mentioned by @dyp.
EDIT This is an answer to an edited question. Well, this is clearly an XY issue. If IntegralSequence is all you need, you can use std::make_integer_sequence in C ++ 14 or check my answer to another question just a few minutes ago for an efficient implementation.
iavr
source share