包含C ++中函数指针的映射

时间:2016-02-15 11:59:59

标签: c++ function-pointers variadic-templates stdmap

问题用包含字符串作为键和函数指针作为值的映射替换我的if和else语句。但是,每个函数指针都可以指向具有不同返回类型和不同参数的函数,而无需使用boost。基本上我想知道的是你如何用通用函数指针作为它的值来创建一个地图。

以下是我试图解决的问题的简化版本。所需的输出。

#include<iostream>

int addtwoNumber(int a, int b){
    return a+b;
}
bool isEqual(std::string str, int number){
    return std::stoi(str)==number;
}

int main(){
    // create a map that contains funtion pointers
    template<typename ReturnType, typename... Args>
    std::map<std::string, ReturnType (*)(Args...)> actionMap; // create a map<string, function pointer>


    actionMap.insert(std::make_pair("one", &addtwoNumber)); // add functions to the map
    actionMap.insert(std::make_pair("two", &isEqual));

    std::cout << "type commands and arguments: " << std::endl;
    std::string command;
    std::cin >> command;
    auto func = actionMap.find(command[0]);
    std::cout << *func() << std::endl; // how do I pass the arguments to the function
}

期望的输出:

./test.out              
one 2 5                  /user input
7                        /Output of the program
./test.out
two 5 5
true

2 个答案:

答案 0 :(得分:2)

struct do_nothing_map{
  void insert(...){}
  int(*)() find(...){return []{return 0;};}
};
int main(){
  do_nothing_map actionMap;

  actionMap.insert(std::make_pair("one", &addtwoNumber));
  actionMap.insert(std::make_pair("two", &isEqual));

  std::cout << "type commands and arguments: " << std::endl;
  std::string command;
  std::cin >> command;
  auto func = actionMap.find(command[0]);
  std::cout << *func() << std::endl;
}

你拒绝更广泛地描述你的问题,而是说你“只是想要编译上面的代码”。我尽可能少地使用它进行编译。它没有任何用处,但它编译,几乎没有变化。

欢迎您提前。

答案 1 :(得分:1)

这是一个类似的问题,答案应该是有用的: answer showing heterogeneous function map

答案显示了如何在地图中调用函数。