【问题标题】:Call functions C++调用函数 C++
【发布时间】:2018-01-16 06:27:55
【问题描述】:

我想用这种方式调用C++函数:

我有一个将字符串与相应的 c++ 函数匹配的数组

int x() {
return 6;
}

int y(int t){

return t;
}

A functions[] = { { "x" , void*&x } , { "y", void*&y}};

A 就是一个简单的结构体。 程序获取一个字符串作为用户的输入。

如果我有一个黑魔法盒函数 Z ,它将一个字符串作为参数,并在数组“functions”中搜索并返回与字符串参数相等的 struct 的第二个元素。 例如Z("x") 返回void*&x ..etc..

如果我不知道函数数组中的所有函数,我该如何调用 Z 的返回函数?

例如我想要这样的东西:

void *  g = Z("y");   //returns the y function
g(8);

我不想要特定的演员表或 if/else,因为第一次用户可能会给出“x”,第二次给出“y”,而第二次我不想要 if/其他情况,因为函数的数量可能是无穷大。

【问题讨论】:

  • 所有函数的签名是否相同(返回值和输入参数的类型相同)?
  • 正如我在示例中提到的 x 和 y 函数具有不同的签名。所以答案是否定的。
  • @LeAdErQ 你问过如何调用函数,但你必须在某处检索参数......就像8 来自哪里?也许您应该扩展您要解决的原始问题?
  • 好吧,如果你对 Holt 这么说,那么 会告诉你,我们真的不欠你一个答案,这取决于 你 i> 清楚地呈现它。没有人会因为帮助粗鲁的人而绊倒自己。
  • 您不知道什么可以帮助解决问题。如果你这样做了,你就不会有问题了。

标签: c++ string function call


【解决方案1】:

我们来看看函数数组

A functions[] = { { "x" , void*&x } , { "y", void*&y}};

在我看来,每个函数都与它们的名称一起存储。为了找到具有给定名称的函数,只需找到存储该名称的A 实例即可。您可以使用for 循环来迭代函数数组。

for(size_t i = 0; i < sizeof(functions) / sizeof(A); i++) {
    if(functions[i].name == desiredFunctionName) {
        return functions[i].fxn;
    }
}

【讨论】:

  • 我的问题不是如何返回正确的函数!但是怎么调用这个函数呢!
  • 哦。如果您不知道函数的签名,那是不可能的。 @LeAdErQ
【解决方案2】:

创建一个映射,其中键值是字符串,例如-“x”、“Y”,值是函数指针。 当您在 map 中使用键值进行搜索时,您将获得指向所需函数的函数指针。 将其分配给 void * g,然后取消引用它以调用该函数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-22
    相关资源
    最近更新 更多