Вызываемый экземпляр функции должен зависеть от параметра - PullRequest
0 голосов
/ 18 октября 2018

Я бы хотел, чтобы вызов функции зависел от параметра, то есть от того, какая версия функции вызывается.Я ищу способ заставить следующий код работать, не делая enum_value v аргумент шаблона.Цель состоит в том, чтобы при v==enum_value::A вызывался первый экземпляр.Если v==enum_value::B, должен быть вызван второй экземпляр.

enum class enum_value { A, B, C };

auto foo(enum_value v) -> std::enable_if_t<v==enum_value::A>
{}

auto foo(enum_value v) -> std::enable_if_t<v==enum_value::B>
{}

Не стесняйтесь спрашивать, нужно ли мне уточнить.

1 Ответ

0 голосов
/ 18 октября 2018

Я ищу способ заставить следующий код работать без указания аргумента шаблона 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;             
    }
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...