#include <tuple>
#include <iostream>
template <typename... T>
void my_real_func(T&&... args)
{
bool foo[] = { std::cout << args << ' '... };
}
template <int... i, typename... T>
void func(T&&... args)
{
using tuple_type = std::tuple<T&&...>;
tuple_type arg_tuple( std::forward<T>( args )... );
my_real_func( std::forward<typename std::tuple_element<i-1, tuple_type>::type>( std::get<i-1>( arg_tuple ) )... );
}
int main()
{
func<1, 2, 3>( 2, 3, 5 ); std::cout << '\n';
func<2, 1, 3>( 2, 3, 5 ); std::cout << '\n';
func<2, 2, 2>( 2, 3, 5 ); std::cout << '\n';
}
I2luY2x1ZGUgPHR1cGxlPgojaW5jbHVkZSA8aW9zdHJlYW0+Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUuLi4gVD4Kdm9pZCBteV9yZWFsX2Z1bmMoVCYmLi4uIGFyZ3MpCnsKICAgIGJvb2wgZm9vW10gPSB7IHN0ZDo6Y291dCA8PCBhcmdzIDw8ICcgJy4uLiB9Owp9Cgp0ZW1wbGF0ZSA8aW50Li4uIGksIHR5cGVuYW1lLi4uIFQ+CnZvaWQgZnVuYyhUJiYuLi4gYXJncykKewogICAgdXNpbmcgdHVwbGVfdHlwZSA9IHN0ZDo6dHVwbGU8VCYmLi4uPjsKICAgIHR1cGxlX3R5cGUgYXJnX3R1cGxlKCBzdGQ6OmZvcndhcmQ8VD4oIGFyZ3MgKS4uLiApOwogICAgbXlfcmVhbF9mdW5jKCBzdGQ6OmZvcndhcmQ8dHlwZW5hbWUgc3RkOjp0dXBsZV9lbGVtZW50PGktMSwgdHVwbGVfdHlwZT46OnR5cGU+KCBzdGQ6OmdldDxpLTE+KCBhcmdfdHVwbGUgKSApLi4uICk7Cn0KCmludCBtYWluKCkKewogICAgZnVuYzwxLCAyLCAzPiggMiwgMywgNSApOyBzdGQ6OmNvdXQgPDwgJ1xuJzsKICAgIGZ1bmM8MiwgMSwgMz4oIDIsIDMsIDUgKTsgc3RkOjpjb3V0IDw8ICdcbic7CiAgICBmdW5jPDIsIDIsIDI+KCAyLCAzLCA1ICk7IHN0ZDo6Y291dCA8PCAnXG4nOwp9