假设我有几个函数,例如function1()
,function2()
,.....,function1000()
我在一个函数中得到一个字符串,让我们说call_function(string function_name)
现在我需要根据function_name
执行函数。
我搜索了解决方案,发现我可以使用地图。
有没有简单的方法为1000 keys(string type)
和各自的功能创建地图?
例如:call_function(function541)
然后它应该执行function541()
;
答案 0 :(得分:0)
你可以使用map来实现这个东西的函数指针
void func1(const char *args)
{
//....
}
void func2(const char *args)
{
//....
}
typedef void (*function) (const char *args);
//......
std::map<std::string, function> func_map;
func_map.insert(std::pair<std::string, function>("func1", func1));
func_map.insert(std::pair<std::string, function>("func2", func2));
func_map["func1"]("arg1 arg2 arg3"); // Here is the func1 call
答案 1 :(得分:0)
有没有简单的方法为1000
keys(string type)
和各自的功能创建地图?例如:
call_function(function541)
然后它应该执行function541()
;
不,没有简单的方法,因为 C ++没有反射。函数名仅存在于编译器中。在运行时,源代码中名为function541
的函数与执行程序时内存中存在的字符串"function541"
之间没有关系。
必须手动建立每个和任何此类链接:
std::map<std::string, std::function<void()>> map;
// ...
map["function541"] = function541;
当然,您仍然可以使用代码生成自动执行此类任务。像这样的机械名称的函数看起来不像手动编写的C ++代码。也就是说,您可以使用其他语言编写脚本来创建C ++代码,以将数千个函数添加到地图中,这可能是某种预构建步骤。
但是,从运行时的角度来看,无论如何都没有自动化。