#include <iostream>

template <size_t... Is>
struct index_sequence{};

namespace detail {
	template <size_t I,size_t...Is>
	struct make_index_sequence_impl : make_index_sequence_impl<I-1,I,Is...> {};
	
	template <size_t...Is>
	struct make_index_sequence_impl<0,Is...>
	{
		using type = index_sequence<0,Is...>;
	};
}

template<size_t N>
using make_index_sequence = typename detail::make_index_sequence_impl<N>::type;


template<size_t I>
void templated_func()
{
	std::cout << "templated_func" << I << std::endl;
}

template <size_t... Is>
void call_templated_func(index_sequence< Is...>)
{
	using do_ = int[];
    do_ {0,(templated_func<Is>(),0)...,0};
}

int main()
{
    call_templated_func(make_index_sequence< 10>());
    return 0;
}
