在不显式引用根据输入而更改的函数的情况下调用该函数

Calling a function without explicitly refering to it that changes according to input

本文关键字:函数 情况下 调用 输入 引用      更新时间:2023-10-16

我正在尝试创建一个尽可能高效的速度、距离和时间计算器,并希望使用根据输入而变化的指针来调用函数,但不确定如何做到这一点。我尝试了很多不同的方法:

我的最佳尝试:

// 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?

有没有一种方法可以在不使用指针或其他方式显式引用该函数的情况下调用该函数。就像从根据输入而变化的指针中调用函数一样?我真的不知道从哪里开始,用什么,因为我尝试的一切都是非法的。我基本上想在运行时选择函数,而不使用几个if,从而避免重复。(我发现有人有类似的问题,但还没有找到一种有效的方法来达到我的目的。)

提前感谢

是的,我是C++的新手,在指针/引用和内存方面做得不多。

编辑:为了参考,修改后的完整代码-可编译

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

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

Math m;
double res = m.calcSpeed(1.0, 2.0);

那么与指向成员p的指针等价的是:

Math m;
FuncChosen p = &Math::calcSpeed;
(m.*p)(1.0, 2.0);

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


为完整起见:以上内容适用于非静态成员函数。如果calcSpeed等是静态成员函数,则可以使用指向函数的普通指针来引用它们。

没有对象就不能调用非静态函数。回答这个问题:你能这样称呼calcSpeed吗?

calcSpeed(10.4, 444.0);

没有。因为它需要左边的一个物体。

Math o;
o.calcSpeed(10.4, 444.0);

您可以将地址保留到此方法,但必须使用对象调用它

(o.*p)(10.4, 444.0);

添加

如果对象由指针(Math* po = &o;)引用,则需要使用->*运算符:

(po->*p)(10.4, 444.0);

与相同

((*po).*p)(10.4, 444.0);
相关文章: