我正在尝试设置一个在执行期间根据一组用户参数设置的函数指针。我想让函数指针指向一个非静态成员函数,但我找不到怎么做。
我见过的例子说这只能使用静态成员函数或在直接 C 中使用全局变量。
一个简化的例子如下:
class CA
{
public:
CA(void) {};
~CA(void) {};
void setA(double x) {a = x; };
void setB(double x) {b = x; };
double getA(const double x) {return x*a; };
double getB(const double x) {return x*b; };
void print(double f(const double), double x) {
char cTemp[256];
sprintf_s(cTemp, "Value = %f", f(x));
std::cout << cTemp;
};
private:
double a, b;
};
实现部分是
CA cA;
cA.setA(1.0);
cA.setB(2.0);
double (*p)(const double);
if(true) {
p = &cA.getA; //'&' : illegal operation on bound member function expression
} else {
p = cA.getB; //'CA::getB': function call missing argument list; use '&CA::getB' to create a pointer to member
//'=' : cannot convert from 'double (__thiscall CA::* )(const double)' to 'double (__cdecl *)(const double)'
}
cA.print(p, 3.0);
那么我如何让 p 指向 'getA' 或 'getB' 以便 'print' 仍然可以使用它。
据我所见,建议是使用 boost 或 std::bind ,但我对这两种方法都没有经验。我希望我不需要深入研究这些,我只是错过了一些东西。
编译器 MSVC++ 2008
最佳答案
不要忘记成员函数接受隐式 this
参数:因此,接受 double
的成员函数不能与非接受 double
的成员(免费)函数。
// OK for global functions
double (*p)(const double);
// OK for member functions
double (CA:*p)(const double);
您调用它们的方式也不同。首先,对于成员函数,您需要一个对象来调用它们(其地址最终将绑定(bind)到函数调用中的 this
指针)。其次,您需要使用 .*
运算符(如果您通过指针执行调用,则需要使用 ->*
运算符):
p = &CA::getA;
CA cA;
(cA.*p)();
始终如一,您必须更改函数 print()
的定义:
#include <iostream>
void print(double (CA::*f)(const double), double x)
{
// Rather use the C++ I/O Library if you can...
std::cout << "Value = " << (this->*f)(x);
};
所以最后,这就是你应该如何重写你的 main()
函数:
int main()
{
CA cA;
cA.setA(1.0);
cA.setB(2.0);
double (CA::*p)(const double);
if (true) // Maybe use some more exciting condition :-)
{
p = &CA::getA;
}
else {
p = &CA::getB;
}
cA.print(p, 3.0);
}
关于c++ - 设置指向非静态成员函数的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15035905/