Как насчет этого?
#include <utility>
template <std::size_t I>
int foo(int arg) {
return I * arg;
}
template<std::size_t ...Is>
auto get_foo(std::index_sequence<Is...>, int i) {
return *(std::initializer_list<int(*)(int)>{&foo<Is>...}.begin() + i);
}
int foo(std::size_t i, int arg) {
return get_foo(std::make_index_sequence<11>(), i)(arg);
}
Вот еще одно решение, которое оптимизирует более приятно:
#include <utility>
template <std::size_t I>
int foo(int arg) {
return I * arg;
}
template<std::size_t ...Is>
auto foo(std::index_sequence<Is...>, int i, int arg) {
int ret;
((Is == i && (ret = foo<Is>(arg))), ...);
return ret;
}
int foo(std::size_t i, int arg) {
return foo(std::make_index_sequence<11>(), i, arg);
}