是否可以在一个变量中存储任何类型的函数?

时间:2019-03-19 09:51:24

标签: c++ function variables

我正在尝试制作一个菜单数组,其中每个元素都是一个结构,用于存储文本变量,需要按下以选择该项目的键以及在该按键上调用的功能(例如“ Quit”,“ Q ', 放弃())。我以为这样可以使事情变得更有效,但是我找不到一种使它可以与各种函数和参数类型一起工作的方法(例如,一个项目应该可以不带参数地调用void函数,而另一个可以与两个参数,依此类推)。有什么好办法吗?还是我最好放弃这个主意?

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

2 个答案:

答案 0 :(得分:9)

实际上有几种方法。

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

还可以考虑覆盖您的课程中的operator()

答案 1 :(得分:1)

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

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

将枚举或整数作为参数之一的原因是“命令类型”是一种超级流行的东西,那么为什么要进行所有这些转换和提取才能得到它呢?

如果由于这种方法而导致性能问题,那么还有其他问题,但这实际上已经在Windows中使用了数十年。