我的主程序读取配置文件,配置文件告诉它运行哪些函数。这些函数是在一个单独的文件中,当我创建一个新函数时,我必须在主程序中添加函数调用(因此当配置文件指示它时可以引发它)
我的问题是,有什么方法可以让主程序单独使用,当我添加一个新函数时,它可以通过某种数组调用。
示例(忍受我,我不确定你能做到这一点)。
我有一个数组(或枚举),
char functions [3] = ["hello()","run()","find()"];
当我读取配置文件并且它说运行hello()时,我可以使用数组运行它(我可以找到数组中是否存在测试)
我也可以轻松地为数组添加新功能。
注意:我知道无法使用数组,所以只是一个例子
答案 0 :(得分:5)
我认为这样的事情。
#include <functional>
#include <map>
#include <iostream>
#include <string>
void hello()
{
std::cout << "Hello" << std::endl;
}
void what()
{
std::cout << "What" << std::endl;
}
int main()
{
std::map<std::string, std::function<void()>> functions =
{
std::make_pair("hello", hello),
std::make_pair("what", what)
};
functions["hello"]();
}
http://liveworkspace.org/code/49685630531cd6284de6eed9b10e0870
答案 1 :(得分:3)
使用指向函数的指针来完成它。
例如(我不确定语法):
map<string,void(*)()> funcs;
然后执行funcs[name]();
答案 2 :(得分:2)
从您的main中公开一个可以在地图中注册新元组{ function_name, function_pointer}
的函数(由其他答案提出)。
典型地:
// main.h
typedef void (*my_function)(void *);
int register_function(const std::string &name, my_function function);
// main.c
int register_function(const std::string &name, my_function function)
{
static std::map<std::string, my_function> s_functions;
s_functions[name] = function;
return 0;
}
int main()
{
for( std::map<std::string, my_function>::const_iterator i=s_functions.begin();
i != s_functions.end();
++i)
{
if( i->second )
{
// excecute each function that was registered
(my_function)(i->second)(NULL);
}
}
// another possibility: execute only the one you know the name of:
std::string function_name = "hello";
std::map<std::string, my_function>::const_iterator found = s_functions.find(function_name);
if( found != s_functions.end() )
{
// found the function we have to run, do it
(my_function)(found->second)(NULL);
}
}
现在,在每个实现要运行的函数的auther源文件中,执行以下操作:
// hello.c
#include "main.h"
void my_hello_function(void *)
{
// your code
}
static int s_hello = register_function("hello", &my_hello);
这意味着每次使用这种语句添加新的源文件时,它都会自动添加到您可以执行的函数列表中。
答案 3 :(得分:1)
查看function pointers(也称为“仿函数”)。您可以有条件地调用对您选择的各种函数之一的引用,而不是调用特定函数。教程here提供了有关该主题的详细介绍。