在C / C ++中自动调用函数

时间:2012-07-18 06:02:20

标签: c++ c

我的主程序读取配置文件,配置文件告诉它运行哪些函数。这些函数是在一个单独的文件中,当我创建一个新函数时,我必须在主程序中添加函数调用(因此当配置文件指示它时可以引发它)

我的问题是,有什么方法可以让主程序单独使用,当我添加一个新函数时,它可以通过某种数组调用。

示例(忍受我,我不确定你能做到这一点)。

我有一个数组(或枚举),

char functions [3] = ["hello()","run()","find()"];

当我读取配置文件并且它说运行hello()时,我可以使用数组运行它(我可以找到数组中是否存在测试)

我也可以轻松地为数组添加新功能。

注意:我知道无法使用数组,所以只是一个例子

4 个答案:

答案 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提供了有关该主题的详细介绍。