我正在尝试使用指向函数成员的指针,但我无法弄清楚它是如何工作的。
我有一个看起来像这样的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)
我不能使用static / const成员,因为在我的最终实现中,A将指向A对象集合中的特定A,其中的对象看起来像这样
vector<A> vecA;
myA = &vecA[xxx]
这样做很糟糕
typedef float (A::*pA)(float x, float y);
pA p = &myA->Minus;
并且编译器告诉我使用&amp; A :: Minus,但这对我不起作用。
我甚至可以这样做吗?
干杯
答案 0 :(得分: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
答案 1 :(得分: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));
请注意function
和bind
是C ++ 11中的新功能。如果您使用旧版本的语言,Boost会提供等价物。
答案 2 :(得分:2)
#define CALL_MEMBER_FN(object,ptrToMember) ((object).*(ptrToMember))
调用您的成员函数很简单,因为您要调用的函数为already have a typedef。
float result = CALL_MEMBER_FN(*myA, pA)(a, b);