调用函数而不显式引用它根据输入而改变

exi*_*ode 2 c++ pointers typedef reference non-repetitive

我正在尝试创建一个尽可能高效的速度距离和时间计算器,并且想要使用根据输入而变化的指针来调用函数,但我不确定如何这样做.我尝试了很多不同的东西:

我最好的尝试:

// Inside class Math
double calcSpeed(double distance, double time); // These functions return a double value of the formula (non static)
double calcDistance(double speed, double time);
double calcTime(double speed, double distance);

// Inside Main
typedef double (Math::*FuncChosen)(double first, double second);
FuncChosen p = &Math::calcSpeed; // This changes according to input to different functions in Math class with same parameter types and return types
p(1, 2); // Not a function, how can I non explicitly call the function?
Run Code Online (Sandbox Code Playgroud)

有没有办法调用此函数,而无需使用指针或其他方式明确引用它.就像从根据输入改变的指针调用函数一样?我真的不知道从哪里开始和使用什么,因为我尝试的一切都是非法的.我基本上想在运行时选择该函数而不使用几个ifs,从而避免重复.(我发现有类似问题的人,但没有找到一种有效的方法来实现我的目的.)

提前致谢,

并且,是的,我是C++的新手,并且没有使用指针/引用和内存做太多.

编辑:作为参考,修正后完成的完整代码 - 可编辑

Rei*_*ica 5

您没有包含MCVE,但注释和代码表明函数是类中的非静态成员函数Math.该类型FuncChosen指向成员函数指针.

指向成员的指针是奇怪的野兽.它不是一个真正的指针,因为它没有直接指向任何东西.将指向成员的指针想象为"类中的标识符".因此,p标识特定的成员函数(例如calcSpeed).正如您通常只能通过在对象上调用它来调用成员函数一样,您需要提供一个对象来通过指向成员的指针进行调用.所以,例如,如果你有这个代码:

Math m;
double res = m.calcSpeed(1.0, 2.0);
Run Code Online (Sandbox Code Playgroud)

那么指向成员的等价物p将是:

Math m;
FuncChosen p = &Math::calcSpeed;
(m.*p)(1.0, 2.0);
Run Code Online (Sandbox Code Playgroud)

运算符.*(和相应的->*)用于取消引用指向成员的指针.


完整性:以上内容适用于非静态成员函数.如果calcSpeed等等是静态成员函数,则可以使用函数的常规指针来引用它们.