【问题标题】:array of overloaded functions in c++C++中的重载函数数组
【发布时间】:2012-02-23 00:03:37
【问题描述】:

我在 c++ 中有几个重载函数,我想将它们组成一个数组,以便我可以在循环中使用它们(实际上我想随机调用它们)。你能帮忙吗 ?教程只展示了如何使用相同的函数参数来处理函数指针数组。

【问题讨论】:

  • 不清楚你到底想做什么。您能否添加一些伪代码来说明您希望能够做什么?
  • @SethCarnegie:看起来,如何在不知道需要什么参数的情况下调用一个。
  • C++ 无法从函数指针和参数列表生成函数调用。
  • 作为一个建议,你可以试试 C++ 中的函子
  • 既然你说“重载函数”和“数组”:不可能。您可能这样做的唯一方法是创建一个std(boost)::function 对象的向量/数组,这些对象绑定了非公共参数。在不知道参数类型和数量的情况下,在 C++ 中调用不同签名的函数本质上既不可能也不安全。可以通过滥用强制转换来进行尝试,但您的结果可能是:堆或堆栈损坏,或者希望彻底崩溃。

标签: c++ arrays overloading


【解决方案1】:

我认为这里的主要问题是,您想要的似乎需要在执行时而不是在编译时确定函数参数的类型和顺序。你在这里的主要目标是什么?执行速度?代码可读性还是“正确性”?如果您追求执行速度,那么我认为有一些丑陋的解决方案。据我了解您的问题,您将使用随机选择的数组索引来决定您将调用哪个“重载函数”。因此,一种不一定安全的可能性是使用函子并将数组指针中的每个函子的创建者传递给它将在未来使用的变量,就好像这些变量是它的参数一样。但这只有在您始终使用与“函数”调用的参数相同的变量时才有效。

【讨论】:

  • 谢谢大家,我最初的解决方案与上面第一个响应的想法相同,我尝试压缩并使我的代码更“优雅”。 (当然我也想在这个过程中尽可能多地学习)。所以现在我正在阅读函子,谢谢 dashesy 和 rayo hauno。
  • 我还将阅读“std(boost)::function objects 的向量/数组” - 这看起来很有趣,而且我认为非常适合我的目的 - 谢谢 Nathan Ernst
【解决方案2】:

等等,你想随机调用一组重载函数吗?

为什么不直接创建一个快速的 rand 函数,然后使用 switch 语句?

例如,假设您有 3 个重载函数:

srand(time(0));
int rand = rand() % 3 // Replace 3 with number of functions.

switch(rand)
{
   case 0:
      test("this is a string!");
      break;
   case 1:
      test(12, 16);
      break;
   case 2:
      test(16.2, 3, "Hello, World!");
      break;
}

否则,您很可能会遇到麻烦,因为数组中的每个函数都不同并且期望的参数不同。您需要一些方法来确定哪些参数传递到哪个函数,而仅使用函数的地址是无法做到的。

我想说的是,除非您使用类似于上述方法的方法,否则您几乎不可能完成您正在尝试做的事情,即使那样您也需要从某个地方获取参数。

【讨论】:

  • 如果速度是主要目标,那么这个解决方案将会很慢。例如,假设您有 1.000.000 个函数(我知道,这确实是一个很大的数字 xD),那么您将需要测试 1.000.000 个案例。另一方面,使用函数向量将需要与函数数量无关的恒定时间“访问”。我知道这种问题(使用函数向量)很尴尬,但前一段时间我遇到了类似的问题,我不记得具体是怎么回事,但想法是模拟一种“游戏”,其中每个函数是某种策略……
  • @rayo hauno 确实很慢,但我真的不知道如何将它们存储在向量中。在不知道函数需要什么参数的情况下,这似乎是不可能的。想象一下,你被蒙住眼睛,必须剪断正确的电线,否则炸弹会爆炸。您有 16 根电线,但不知道哪根是哪根,也不知道它们的位置。你必须让它有机会获得正确的电线。 C++ 很讨厌,它什么都不知道,然后它告诉你滚蛋。在这种情况下,它是相同的,你可以知道的唯一方法是测试每一个,但 c++ 说不。
  • 我在上面发布了一个奇怪的解决方案......基本上你可以使用函子,其参数是“引用”(可能是指针)到你想用作参数的变量。每个函子都有自己特定的、固定的参数集,直到它被销毁。
猜你喜欢
  • 2011-02-10
  • 2014-06-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-31
  • 2022-12-22
相关资源
最近更新 更多