Есть ли способ динамического вызова функций по их имени в C ++ - PullRequest
0 голосов
/ 12 октября 2019

У меня есть список функций, названных так: 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;

Ответы [ 3 ]

3 голосов
/ 12 октября 2019

Нет. В C ++ такого отражения нет.

Вы всегда можете создать структуру, которая отображает строки в указатели на функции, но вам придется инициализировать эту структуру самостоятельно.

1 голос
/ 12 октября 2019

Вы можете сделать что-то вроде этого

#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);

и так далее

1 голос
/ 12 октября 2019

Вместо одного действительно длинного оператора switch мне интересно, есть ли способ сделать это, добавив пользовательский ввод в вызов функции.

Нет.

Не все так просто.

Лучшее, что я могу себе представить, - это использование std::vector из std::function с (или также указателей функций), чтобы вы могли написать что-то как

vfunc[0] = &F0;
vfunc[1] = &F1;
// ...

auto functionToCall = vfunc[choice]; // or better vfunc.at(choice);
...