具有不同名称但相同参数的函数

时间:2017-03-29 14:59:42

标签: c++ macros

我有一组函数,它们具有相同数量的参数,但名称不同(假设每个函数实现不同的方法)。我在字符串中有所请求方法的名称。是否可以使用方法名称调用相应的函数。为了说清楚,假设我有以下功能(我刚才提到了他们的名字和参数):

search_esa(int a, int b);
search_tss(int a, int b);
search_fss(int a, int b);
search_ds(int a, int b);

现在假设我有所请求方法的名称,让我们假设esa,在一个字符串中:

string methodName = "esa"

是否可以使用宏调用相应的函数? 我测试了

#define CALL_SEARCH_MV(method) search_##method

然后尝试通过以下方式调用它:

CALL_SEARCH_MV(methodName.c_str())

但它调用search_methodName函数,该函数不存在。任何其他建议将不胜感激(除了建议切换案例方法或如果)。

4 个答案:

答案 0 :(得分:4)

这样的事可能有用:

std::map<std::string, std::function<void(int, int)>> functions{
    {"esa", search_esa},
    {"tss", search_tss},
    {"fss", search_fss},
    {"ds", search_ds}
};

int main(int argc, char ** argv) {
    std::string cmd = argv[1];
    functions.at(cmd)(5, 10);
    return 0;
}

但值得注意的是,你无法真正概括这一点。如果您添加了另一个功能,例如search_rsa,则必须手动将其添加到地图中。 C ++没有Java或Python等语言的全面反射功能,因此您不能只编写一个带字符串的函数,并搜索名称与该字符串匹配的方法。

答案 1 :(得分:1)

您可以将函数指针存储在容器中。所以你可以映射几乎任何东西。语法非常简单:

#include <iostream>
#include <map>
using namespace std;

int f1(int a, int b) { return a+b; }
int f2(int a, int b) { return a*b; }

int main() {
    int x = 5;
    int y = 3;
    map<string, int(*)(int, int)> f;

    f["add"] = &f1;
    f["mul"] = &f2;

    cout << f["add"](x,y) << "\n";
    cout << f["mul"](x,y) << "\n";
    return 0;
}

直播:http://ideone.com/wLjw1i

因此,您可以存储具有匹配签名的任何函数(+返回类型)。这是一个间接费用。这意味着它们更难以优化,因为跳转目标是在运行时设置的。

您可以使用std::function使其更加通用,同样需要很少的性能费用。

答案 2 :(得分:0)

您可以结合使用宏,功能指针和巧妙的黑客来轻松实现所需的结果。

在您的main.cpp中(或搜索功能所在的位置):

#include <map>
#include <string>
#include <iostream>

typedef int(*search)(int a, int b);

#define SEARCH(x) int search_##x(int a, int b);
#include "search_func.incl"
#undef SEARCH

#define SEARCH(x) {#x, search_##x},
std::map<std::string, search> search_funcs = {
#include "search_func.incl"    
};
#undef SEARCH


int main(char** argv, int argc)
{
    std::cout << search_funcs["esa"](1, 2) << std::endl;
    std::cout << search_funcs["tss"](3, 4) << std::endl;
    std::cout << search_funcs["fss"](5, 6) << std::endl;
    std::cout << search_funcs["ds"](7, 8) << std::endl;

    return 0;
}

int search_esa(int a, int b) { return 100 * a + 10 * b + 0; }
int search_tss(int a, int b) { return 100 * a + 10 * b + 1; }
int search_fss(int a, int b) { return 100 * a + 10 * b + 2; }
int search_ds(int a, int b) { return 100 * a + 10 * b + 3; }

在search_func.incl

SEARCH(esa)
SEARCH(tss)
SEARCH(fss)
SEARCH(ds)

如何运作 search_func.incl文件使用宏指定搜索功能的名称。当您包含该文件时,您可以切换宏的定义,以便以不同的方式显示所包含的函数。

SEARCH(abc) 

成为第一个函数声明包括:

int search_abc(int a, int b);

和第二个键值对{string,function pointer}包括:

{"abc", search_abc},

这些KVP在地图中,所以当你需要调用一个函数时,字符串会自动映射到函数名。

答案 3 :(得分:-1)

不可能! 必须使用相同的名称调用定义的方法。我们无法操纵方法名称。