Setting a pointer to a non-static member function
c++
Solution
Don't forget that a member function accepts an implicit `this` parameter: therefore, a member function accepting a `double` can't be the same thing as a non-member (free) function accepting a `double`.
// OK for global functions
double (*p)(const double);
// OK for member functions
double (CA::*p)(const double);
Also, the way you invoke them is different. First of all, with member functions, you need an object to invoke them on (its address will eventually be bound to the `this` pointer in the function call). Second, you need to use the `.*` operator (or the `->*` operator if you are performing the call through a pointer):
p = &CA::getA;
CA cA;
(cA.*p)();
Consistently, you will have to change your definition of function `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);
};
So finally, this is how you should rewrite your `main()` function:
int main()
{
CA cA;
cA.setA(1.0);
cA.setB(2.0);
double (CA::*p)(const double);
if (true)
{
p = &CA::getA;
}
else {
p = &CA::getB;
}
cA.print(p, 3.0);
}
Problem
I'm trying to setup a function pointer that is set during execution based on a set of user parameters. I would like to have the function pointer point to a non-static member function but I can't find how to do it. The examples I've seen say this can only be done with static member function only or use global variables in straight C. A simplified example follows: ``` 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; }; ``` The implementation part is ``` 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); ``` So how do I get p to point to either 'getA' or 'getB' so that it is still useable by 'print'. From what I have seen, the suggestions are to use boost or std::bind but I've had no experience with either of these. I'm hoping that I don't need to dive into these and that I'm just missing something. Compiler MSVC++ 2008