Using index sequences ...
#include <utility> #include <iostream> template <typename ... Args> void f1 (Args ... args) { using unused=int[]; (void)unused { 0, (std::cout << args << ", ", 0)... }; std::cout << std::endl; } template <std::size_t> struct getVal { template <typename T1, typename T2> T2 operator() (T1 const &, T2 const & t2) { return t2; } }; template <> struct getVal<0U> { template <typename T1, typename T2> T1 operator() (T1 const & t1, T2 const &) { return t1; } }; template <std::size_t ... Is, typename ... Args> void f2_helper (std::index_sequence<Is...> const &, Args const & ... args) { f1 ( getVal<sizeof...(Is)-Is-1U>()(10, args)... ); } template <typename ... Args> void f2 (Args ... args) { f2_helper(std::make_index_sequence<sizeof...(Args)>{}, args...); } int main() { f1(1, 2L, 3.3, "ten"); // print 1, 2, 3.3, ten, f2(1, 2L, 3.3, "ten"); // print 1, 2, 3.3, 10, }
This solution is in C ++ 14 (requires std::index_sequence and std::make_index_sequence ), but should just create substitutes for C ++ 11 if you need it.
max66
source share