如果我有多个具有相似名称的函数(即fct1,fct2,fct3 ......),并且我从一个带参数中的函数编号的菜单调用它们,有没有办法在没有它的情况下调用它们用各种功能进行切换?
我正在考虑类似的事情:fct[c](); //c is entered by the user
,这当然不起作用。
答案 0 :(得分:5)
将它们全部插入到map ... key是std :: string,它是函数名 value是一个函数指针。
初始化地图后,您可以使用地图查找来查找并执行该功能,并避免使用switch语句
typedef void (*Foo)(void);
std::map< std::string , Foo> FunctionMap;
//Change key type to int if numbers are needed
void PrintA()
{
std::cout << "PrintA" << std::endl;
}
void PrintB()
{
std::cout << "PrintA" << std::endl;
}
void ExecuteFunction( const std::string& funcName )
{
std::map< std::string , Foo>::const_iterator iter = FunctionMap.find(funcName);
if ( iter != FunctionMap.end() )
{
Foo f = iter->second;
f();
}
}
int main()
{
FunctionMap["PrintA"] = PrintA;
FunctionMap["PrintB"] = PrintB;
ExecuteFunction("PrintA");
return 0;
}
答案 1 :(得分:1)
您可以预先声明一个函数指针列表。正是如此:
void Func1() { std::cout << "Func1" << std::endl; }
void Func2() { std::cout << "Func2" << std::endl; }
void Func3() { std::cout << "Func3" << std::endl; }
void (*funcList[])() = {Func1, Func2, Func3};
int main()
{
funcList[0]();
funcList[1]();
funcList[2]();
}
Func1 Func2 Func3 Press any key to continue . . .
编辑:在运行时初始化数组的一个例子 - 它就像任何其他值数组一样,只是在声明时看起来很有趣。
void (*funcList[3])() = {};
void InitFuncList()
{
funcList[0] = Func1;
funcList[1] = Func2;
funcList[2] = Func3;
}
答案 2 :(得分:0)
标准C ++中唯一的选择是填充从键到函数指针的某种查找。这可以是使用字符串作为键的映射,也可以是使用数字作为索引的数组,或者是您提到的开关或比较字符串值的旧if/else
语句。
如果您愿意编写非可移植代码,请查看系统提供的功能,以便在可执行文件(dlsym
,GetProcAddress
或等效文件)中按名称查找功能。只要您的功能在符号表中可用,您就可以通过这种方式获得它们。这个问题几乎等同于Is it possible to call a C function, given its name as a string?,除了你还要担心C ++名称错误。
答案 3 :(得分:0)
如果函数都具有相同的签名,则可以将函数指针放入数组中。例如,
int option1 ()
{
}
int option2 ()
{
}
typedef int(*option)();
const option options[] = {
&option1,
&option2,
};
int n = sizeof(options) / sizeof(option);
int main ( int, char ** )
{
for ( int choice = 0; (std::cin >> choice); )
{
if ((choice < 0) || (choice >= n)) {
std::cout << "Invalid option." << std::endl;
} else {
(*options[choice])();
}
}
}