У меня много функций q1
, q2
, q3
, et c., Каждая из которых имеет свой тип возвращаемого значения (int
, int64_t
, std::string
, et c.) .
У меня также есть функция print_result
, которая выводит их результаты (и время, необходимое для их выполнения, но здесь обрезано для простоты):
template <typename T>
void print_result(T (*func)()) {
T res = func();
std::cout << res << std::endl;
}
У меня также есть большой переключатель оператор для печати результата для каждой из функций:
switch (question_num) {
case 1: print_result(q1); break;
case 2: print_result(q2); break;
case 3: print_result(q3); break;
// ...
}
Цель: Я хотел бы заменить этот оператор switch функцией шаблона, чтобы избежать копирования каждой строки каждый раз, когда я добавляю новая функция.
Я попытался взглянуть на Создание экземпляра шаблона C ++: избегая длинных переключений , но я новичок в метапрограммировании шаблонов, поэтому не знаю, как именно с этим справиться.
Моя текущая попытка, которая не компилируется:
template <<int, typename> ...> struct FuncList {};
template <typename T>
bool handle_cases(int, T, FuncList<>) {
// default case
return false;
}
template <<int I, typename T> ...S>
bool handle_cases(int i, T (*func)(), FuncList<T, S...>) {
if (I != i) {
return handle_cases(i, func, FuncList<S...>());
}
print_result(func);
return true;
}
template <typename ...S>
bool handle_cases(int i, T (*func)()) {
return handle_cases(i, func, FuncList<S...>());
}
// ...
bool res = handle_cases<
<1, q1>, <2, q2>, <3, q3>
>(question_num);
// ...
Мой идеальный способ использования этого шаблона показан в последней строке.
Обратите внимание, что сопоставления из функции там указан номер функции. Номера функций фиксированы, т.е. q1
сопоставляется с константой 1
, и это не изменится во время выполнения.
Ошибка компиляции (это может быть скорее базовая c, но я действительно не много знаю о метапрограммировании):
error: expected unqualified-id before ‘<<’ token
17 | template <<int, typename> ...> struct FuncList {};
| ^~