【问题标题】:Called function instance must depend on parameter被调用的函数实例必须依赖于参数
【发布时间】:2018-10-18 10:39:30
【问题描述】:

我想让函数调用依赖于参数,即调用的是什么版本的函数。我正在寻找一种方法来使以下代码工作,而不使 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>
{}

如果我需要详细说明,请随时询问。

【问题讨论】:

  • 我称之为 XY 问题——你的用例是什么?您不能直接这样做,因为重载解析和模板实例化是编译时过程,而您的值在运行时出现。但是对于您遇到的实际问题,可能有一个解决方案。
  • 我正在为某个问题创建多个解决方案。我只是想知道这是否也是一种方式。感谢您的帮助!

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


【解决方案1】:

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

我不认为你想要什么。

正如 Quentin 所指出的,如果枚举值是函数参数,则它(可能)仅在运行时是已知的。但是编译器必须选择函数编译时间。

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

【讨论】:

    猜你喜欢
    • 2019-11-24
    • 2023-01-27
    • 1970-01-01
    • 1970-01-01
    • 2017-05-08
    • 2014-05-11
    • 2015-06-06
    • 2018-06-10
    • 2021-08-16
    相关资源
    最近更新 更多