映射包含 C++ 中的函数指针
Map containing function pointers in C++
问题用包含字符串作为键和函数指针作为值的映射替换了我的 if 和 else 语句。但是,每个函数指针都可以指向具有不同 return 类型和不同参数的函数,而无需使用 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
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;
}
您拒绝更广泛地描述您的问题,而是说您 "just wanted the above code to compile"。我尽可能少地改变它来编译它。它没有任何用处,但可以编译,并且几乎没有变化。
不客气,提前。
这是一个类似的问题,答案应该有用:
answer showing heterogeneous function map
答案显示了如何在地图中调用函数。
问题用包含字符串作为键和函数指针作为值的映射替换了我的 if 和 else 语句。但是,每个函数指针都可以指向具有不同 return 类型和不同参数的函数,而无需使用 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
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;
}
您拒绝更广泛地描述您的问题,而是说您 "just wanted the above code to compile"。我尽可能少地改变它来编译它。它没有任何用处,但可以编译,并且几乎没有变化。
不客气,提前。
这是一个类似的问题,答案应该有用: answer showing heterogeneous function map
答案显示了如何在地图中调用函数。