我有一组函数,它们具有相同数量的参数,但名称不同(假设每个函数实现不同的方法)。我在字符串中有所请求方法的名称。是否可以使用方法名称调用相应的函数。为了说清楚,假设我有以下功能(我刚才提到了他们的名字和参数):
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函数,该函数不存在。任何其他建议将不胜感激(除了建议切换案例方法或如果)。
答案 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;
}
因此,您可以存储具有匹配签名的任何函数(+返回类型)。这是一个间接费用。这意味着它们更难以优化,因为跳转目标是在运行时设置的。
您可以使用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)
不可能! 必须使用相同的名称调用定义的方法。我们无法操纵方法名称。