Дайте исполняющей программе список функций на выбор, и пусть она выбирает, используя индекс ( живой пример ):
template<std::size_t... Indices>
int call_func_impl(std::index_sequence<Indices...>, int n) {
using FuncType = int(*)();
static const FuncType funcs[] = {func<Indices>...};
return funcs[n]();
}
template<int MaxN>
int call_func(int n) {
return call_func_impl(std::make_index_sequence<MaxN>{}, n);
}
...
call_func<20>(n);
Естественно, вы можете создать массив вручную ( func<0>, func<1>, ...
), но это немного лучше. Если вам нужна последовательность, отличная от 0 до N-1, используйте std::integer_sequence
. Если вам нужна непоследовательность, готового помощника нет, хотя вы можете адаптировать один из вышеперечисленных, если есть шаблон для получения желаемых значений (например, умножьте каждый элемент index_sequence
на 2, чтобы получить четные числа) .
Для полноты картины C ++ 20 предлагает прекрасный (по крайней мере, если вы привыкли к худшему) шаблон для уменьшения количества аргументов копирования и вставки:
template<int MaxN>
int call_func(int n) {
const auto impl = [n]<std::size_t... Indices>(std::index_sequence<Indices...>) {
using FuncType = int(*)();
static const FuncType funcs[] = {func<Indices>...};
return funcs[n]();
};
return impl(std::make_index_sequence<MaxN>{});
}