C++ 使用相似的名称调用多个函数

C++ 使用相似的名称调用多个函数,c++,C++,如果我有多个具有相似名称的函数(即fct1、fct2、fct3…),并且我从一个在参数中包含函数号的菜单调用它们,有没有一种方法可以调用它们而无需对每个函数进行切换 我在想类似的事情:fct[c]()//c由用户输入,这当然不起作用。将它们全部插入地图。。。键是std::string,它是函数名 值是一个函数指针 初始化映射后,可以使用map look up查找并执行函数,避免使用switch语句 typedef void (*Foo)(void); std::map< std::str

如果我有多个具有相似名称的函数(即fct1、fct2、fct3…),并且我从一个在参数中包含函数号的菜单调用它们,有没有一种方法可以调用它们而无需对每个函数进行切换


我在想类似的事情:
fct[c]()//c由用户输入
,这当然不起作用。

将它们全部插入地图。。。键是std::string,它是函数名 值是一个函数指针

初始化映射后,可以使用map look up查找并执行函数,避免使用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;
}
typedef void(*Foo)(void);
std::mapFunctionMap;
//如果需要数字,请将键类型更改为int
void PrintA()
{

std::cout您可以预先声明函数指针列表。因此:

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]();  
} 

<> P>标准C++中唯一的选项是从键到函数指针填充某种类型的查找。这可以是一个使用字符串作为键的映射,或者是一个使用数字作为索引的数组,或者是关于您所提到的开关或一个大的旧代码“I/ORE < /COD>语句比较字符串值”。
如果您愿意编写不可移植的代码,请查看您的系统为在可执行文件中按名称查找函数提供的功能(
dlsym
GetProcAddress
或等效功能)只要你的函数在符号表中可用,你就可以通过这种方式得到。问题几乎等同于,除了你还有C++名字的烦忧。

< p>如果函数都有相同的签名,你可以把函数指针放进数组中。
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])();
        }
    }
}
int选项1()
{
}
int选项2()
{
}
typedef int(*选项)();
常量选项[]={
&选择1,
&选择2,
};
int n=sizeof(选项)/sizeof(选项);
int main(int,char**)
{
for(int choice=0;(std::cin>>choice);)
{
如果((选项<0)| |(选项>=n)){

std::我可以尝试实现此功能,但我不确定如何使用头文件实现。这些函数在我的头文件中声明,并在function.cpp文件中定义。void
(*funcList[])()={Func1,Func2,Func3{;
去哪里?函数是否在头文件中声明并不重要-您可以在任何地方声明函数指针列表。在我的示例中,它被声明为全局并静态分配。您也可以在运行时初始化它,我将在上面的答案中编辑它。或者您可以使用
std::vector并编制索引。如果您有许多可以调用的函数,这将是一个更好的解决方案。另一方面,
map
方法可以使用预处理器宏a la
#define MAPFUNCTION(map,name)map[#name]=name
进行简化。。。
void (*funcList[3])() = {};

void InitFuncList()
{
    funcList[0] = Func1;
    funcList[1] = Func2;
    funcList[2] = Func3;
}
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])();
        }
    }
}