【问题标题】:Is there a way to dynamically call functions by their name in c++有没有办法在 c++ 中通过函数的名称动态调用函数
【发布时间】:2019-10-12 18:22:51
【问题描述】:

我有一个这样命名的函数列表,void F1()void F2().....

我要求用户输入一个数字,它会调用相应的函数。 因此,如果他们输入5,它将调用F5()

与其有一个很长的 switch 语句,我想知道有没有办法通过将用户输入附加到函数调用来做到这一点。 类似于下面的代码

std::cout << "Please enter the number of the function you wish to call " << std::endl;

std::cin >> choice;

functionToCall = "F" + choice;

【问题讨论】:

标签: c++ function c++14


【解决方案1】:

没有。 C++ 没有这种反射。

您始终可以创建一个将字符串映射到函数指针的结构,但您必须自己初始化这个结构。

【讨论】:

    【解决方案2】:

    与其有一个非常长的 switch 语句,我想知道有没有办法通过将用户输入附加到函数调用来做到这一点。

    没有。

    没那么简单。

    我能想象到的最好的方法是使用std::functions 的std::vector(或函数指针),这样你就可以写成

    vfunc[0] = &F0;
    vfunc[1] = &F1;
    // ...
    
    auto functionToCall = vfunc[choice]; // or better vfunc.at(choice);
    

    【讨论】:

      【解决方案3】:

      你可以这样做

      #include <map>
      #include <string>
      #include <cmath>
      
      typedef double(*pfunc)(double);
      std::map<std::string, pfunc> functionMap_;
      
      
      functionMap_["acos"] = acos;
      functionMap_["cos"] = cos;
      functionMap_["asin"] = asin;
      functionMap_["sin"] = sin;
      functionMap_["atan"] = atan;
      functionMap_["tan"] = tan;
      

      要拥有更多参数的函数,您需要使用其他函数指针的映射

      typedef double(*p2func)(double, double);
      typedef void(RPNCalculator::*spfunc)(void);
      

      等等

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-09-27
        • 2010-10-18
        • 1970-01-01
        • 2020-05-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多