在不显式引用根据输入而更改的函数的情况下调用该函数
Calling a function without explicitly refering to it that changes according to input
我正在尝试创建一个尽可能高效的速度、距离和时间计算器,并希望使用根据输入而变化的指针来调用函数,但不确定如何做到这一点。我尝试了很多不同的方法:
我的最佳尝试:
// 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);
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 为什么我不能在不创建字符串变量的情况下使用函数的字符串输出
- 为什么需要复制构造函数,在哪些情况下它们非常有用
- 在不传递参数数量且只有3个点的情况下,如何使用变差函数
- 在这种情况下,java对象是否可以调用本机函数
- 这个c++代码是如何在没有定义函数的情况下运行的
- 为什么不调用移动构造函数?(默认情况下只有构造器,没有别的)
- 如何在没有函数的情况下编写此代码并使C++更简单?
- 在这种情况下显式调用时,std::cout 如何更改析构函数的行为?
- A类的定义需要B类的定义,如何在不公开B的定义的情况下公开A的公共函数?
- 如何在不使用指针的情况下将派生类的对象作为参数传递给基类中的函数?
- 有没有办法在不使用 #ifdef 的情况下不编译发布版本中的单元测试函数体?
- C++ strcpy 函数在少数主要情况下失败
- C++有什么方法可以在既不调用函数模板也不提供其模板参数的情况下引用函数模板?
- 是否可以在不填充自己的参数的情况下将模板函数作为参数传递?
- 如何在没有复制构造函数的情况下为地图设置值?
- 在这种情况下,如何传递成员函数而不是函数?
- C++:带有大括号初始化列表的函数调用表达式 - 标准是否规定在单个元素列表的微不足道的情况下忽略大括号?
- 构造函数/解构函数情况下的'undefined reference to vtable for'
- c#和c++中虚函数情况下编译器行为的差异.这是我在一次采访中被问到的问题