调用的函数实例必须取决于参数

时间:2018-10-18 10:39:30

标签: c++14 template-meta-programming sfinae overload-resolution

我想使函数调用取决于参数,即所调用函数的版本。我正在寻找一种使以下代码正常工作的方法,而无需将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 :(得分:1)

  

我正在寻找一种使以下代码正常工作的方法,而不将enum_value v作为模板参数

我认为您想要的是不可能的。

正如昆汀所指出的那样,如果枚举值是一个函数参数,则(可能)仅在运行时知道。但是编译器必须选择函数的编译时间。

您可以认为,将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;             
    }
 }