#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';
}