调用具有相似名称的多个函数

时间:2011-11-03 00:46:15

标签: c++

如果我有多个具有相似名称的函数(即fct1,fct2,fct3 ......),并且我从一个带参数中的函数编号的菜单调用它们,有没有办法在没有它的情况下调用它们用各种功能进行切换?

我正在考虑类似的事情:fct[c](); //c is entered by the user,这当然不起作用。

4 个答案:

答案 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语句。

如果您愿意编写非可移植代码,请查看系统提供的功能,以便在可执行文件(dlsymGetProcAddress或等效文件)中按名称查找功能。只要您的功能在符号表中可用,您就可以通过这种方式获得它们。这个问题几乎等同于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])();
        }
    }
}