【问题标题】:Is storing any type of function in one variable possible?是否可以将任何类型的函数存储在一个变量中?
【发布时间】:2019-08-09 19:16:53
【问题描述】:

我正在尝试创建一个菜单数组,其中每个元素都是一个存储文本变量的结构,需要按下以选择该项目的键和在该按键上调用的函数(类似于“退出”,'Q ', 放弃())。我认为这会使事情变得更有效率,但我找不到一种方法让它适用于不同的函数和参数类型(例如,一个项目应该能够调用一个没有参数的 void 函数,另一个是一个类 int 函数两个参数等等)。有什么好的方法可以做到这一点,还是我最好放弃这个想法?

编辑:谢谢大家的建议!建议的解决方案对我的新手来说有点太复杂了,但尝试理解它们给了我一些想法!我最终让第三个变量保存了一个枚举而不是直接函数调用,然后创建了一个 switch 函数,该函数根据该值调用其他函数。

【问题讨论】:

  • 您可以使用 lambda 表达式来调用您的实际函数
  • 类实例和两个参数从何而来?
  • 查找Command pattern。请注意,我并不是说为此使用函数。但这种模式是您所需要的通用形式。
  • 注意,单一方法的接口大致相当于std::function类型。

标签: c++ function variables


【解决方案1】:

实际上有几种方法可以做到这一点。

一种方法是使用std::bind 将所有函数绑定到void func(void),然后您可以平等地存储它们。
另一种方法是创建一个通用函数/lambda,它将调用您的函数。
要存储您的函数,您可以使用std::function

还可以考虑覆盖 operator() 的类。

【讨论】:

    【解决方案2】:

    处理这个问题的经典方法是让所有函数都采用相同的参数,并且要非常灵活。例如,一个整数或枚举,以及一​​个指针。

    • 您的无参数函数通过 -1 和 nullptr 并忽略它们
    • 您的多参数函数将指针转换为指向某个结构或类的指针,该结构或类包含所需的所有位和片段(当然,您的调用代码创建了该实例并传递了它的地址)

    枚举或整数作为参数之一被吊出的原因是“命令类型”是一种非常受欢迎的东西,那么为什么要进行所有的转换和提取来获得它呢?

    如果您因为这种方法而遇到性能问题,那么还有其他方法,但实际上这已经在 Windows 中使用了数十年。

    【讨论】:

      猜你喜欢
      • 2013-07-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-04
      • 1970-01-01
      • 2019-11-24
      • 2018-12-08
      • 1970-01-01
      相关资源
      最近更新 更多