以字符串作为参数的c++调用函数

C++ call function with string as parameter

本文关键字:c++ 调用 函数 参数 字符串      更新时间:2023-10-16

假设我有几个函数,如function1(), function2(), ....., function1000()我在一个函数中得到一个字符串,比如call_function(string function_name)
现在我需要执行基于function_name的函数。

我寻找解决方案,发现我可以使用地图。

是否有任何简单的方法来创建一个地图,让1000 keys(string type)和各自的功能?
如:call_function(function541),则执行function541();

可以使用map to function指针来表示这些

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

是否有任何简单的方法来创建一个地图,让1000 keys(string type)和各自的功能?

如:call_function(function541)那么它应该执行function541();

不,没有简单的方法,因为 c++没有反射。函数名只存在于编译器中。在运行时,源代码中称为function541的函数与程序执行时内存中存在的字符串"function541"之间没有关系。

每一个这样的链接必须手动建立:

std::map<std::string, std::function<void()>> map;
// ...
map["function541"] = function541;
当然,您仍然可以通过代码生成自动执行这样的任务。具有这样机械名称的函数看起来不像手工编写的c++代码。也就是说,你可以用其他语言编写一个脚本,创建c++代码,将这一千个函数添加到映射中,也许是作为某种预构建步骤。

但是,从运行时的角度来看,没有任何自动化。