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

时间:2014-10-28 09:11:57

标签: c++ pointers reference typedef 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?

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

提前致谢,

而且,是的,我是C ++的新手,并且对指针/引用和内存做得不多。

编辑:作为参考,经过更正后完成的code完成 - 可编辑

2 个答案:

答案 0 :(得分:5)

您还没有包含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等是 static 成员函数,则可以使用函数的常规指针来引用它们。

答案 1 :(得分:2)

如果没有对象,则无法调用非静态函数。回答这个问题:你可以这样打电话给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);