成员函数指针

5
我是一个有用的助手,可以为您翻译文本。

我正在尝试使用函数成员指针来做一些事情,但我无法弄清楚它是如何工作的。

我有一个类A,看起来像这样

class A
{
    public:
    float Plus    (float a, float b) { return a+b; }
    float Minus   (float a, float b) { return a-b; }
    float Multiply(float a, float b) { return a*b; }
    float Divide  (float a, float b) { return a/b; }
};

我希望声明一个指向A的指针,然后将A的成员函数之一的函数指针传递给另一个函数。 类似这样的代码:
void Will_Get_Function_Pointer(float a, float b, float (A::*pt2Func)(float, float))
{
    (...)
}

我会使用类似这样的方式进行调用

A* myA = new A;
Will_Get_Function_Pointer(1.00,2.00, &myA->Minus)

我不能使用静态/常量成员,因为在我的最终实现中,A将指向一个A对象集合中特定的A对象,看起来像这样:

vector<A> vecA;
myA = &vecA[xxx]

这样做会彻底失败

typedef  float (A::*pA)(float x, float y);
pA p = &myA->Minus;

编译器告诉我使用 &A::Minus,但这对我来说行不通。

我能做到吗?

谢谢

3个回答

6
A* myA = new A;
Will_Get_Function_Pointer(1.00,2.00, &myA->Minus)

你不能这样做。你应该使用类似于的东西
void Will_Get_Function_Pointer(A* object, float a, float b,
float (A::*pt2Func)(float, float))
{
   (object->*pt2Func)(a, b);
}

并将其称为

A* myA = new A;
Will_Get_Function_Pointer(myA, 1.00, 2.00, &A::Minus);

简单的例子。

http://liveworkspace.org/code/79939893695e40f1761d81ba834c5d15


2

很遗憾,该语言不允许您使用该语法将对象绑定到成员函数以创建可调用对象。您可以在调用函数时传递一个对象引用(或指针)并进行绑定:

void Will_Get_Function_Pointer(float a, float b, A & obj, float (A::*pt2Func)(float, float))
{
    (obj.pt2Func)(a,b);
}

Will_Get_Function_Pointer(1.00, 2.00, myA, &A::Minus);

或者您可以创建一个函数对象,将函数指针绑定到对象上:
void Will_Get_Function(float a, float b, std::function<float(float,float)> f)
{
    f(a,b);
}

Will_Get_Function(1.00, 2.00, std::bind(&A::Minus, &myA));

注意,functionbind是C++11中新增的内容;如果你使用的是旧版本的语言,Boost提供了相应的替代品。

+1 for bind - 当处理对函数的引用时,这通常是首选函数。 - Marcin
不能使用C++11或Boost。但是它的绑定语法确实非常好。 - André Moreira

2

Use a macro.

#define CALL_MEMBER_FN(object,ptrToMember)  ((object).*(ptrToMember))

调用您的成员函数很简单,因为您已经有了要调用的函数的 typedef

float result = CALL_MEMBER_FN(*myA, pA)(a, b);

不要错过常见问题解答中有关声明指向成员函数的建议:使用typedef - Robᵩ
我认为应该是 CALL_MEMBER_FN(*myA, pA)(x, y);,因为尽管它的名字是这样,但你的宏并没有调用任何东西。个人而言,我觉得 (myA->pA)(x, y) 比那个混乱的写法更易读。 - Mike Seymour

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接