我想使函数调用取决于参数,即所调用函数的版本。我正在寻找一种使以下代码正常工作的方法,而无需将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>
{}
随时问我是否需要详细说明。
答案 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;
}
}