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 但这对我不起作用。

我什至可以这样做吗?

干杯

4

3 回答 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

于 2012-09-06T16:05:43.037 回答
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 会提供等价物。

于 2012-09-06T16:13:19.077 回答
2

使用宏。

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

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

float result = CALL_MEMBER_FN(*myA, pA)(a, b);
于 2012-09-06T16:13:27.173 回答