Я ищу способ заставить следующий код работать без указания аргумента шаблона enum_value va
Не думаю, что это возможно, что вы хотите.
Как указал Квентин, если значение перечисления является аргументом функции, оно известно (потенциально) только во время выполнения.Но компилятор должен выбрать функцию времени компиляции.
Можно подумать, что make foo()
constexpr
, передавая значение constexpr
в качестве аргументов, разрешает выбор правильной функции во время компиляции.Но это не работает, потому что функция constexpr
может выполняться во время компиляции, но также может выполняться во время выполнения.Таким образом, компилятор выдает ошибку, потому что должен учитывать случай выполнения.
Лучшее, что я могу себе представить (я знаю, что это не очень удачное решение), - это пройти через функцию выбора;что-то вроде
enum class enum_value { A, B, C };
void foo_A ()
{ }
void foo_B ()
{ }
// ....
void select_foo (enum_value v)
{
switch (v)
{
case A: foo_A(); break;
case B: foo_B(); break;
// ...
default: break;
}
}