Я пытаюсь что-то сделать с указателями на функции-члены, которые я не могу понять, как это работает.
У меня есть класс А, который выглядит примерно так
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;
и компилятор говорит мне использовать &A :: Минус, но это не будет работать для меня.
Могу ли я даже сделать это?
ура
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
К сожалению, язык не позволяет использовать этот синтаксис для привязки объекта к функции-члену для создания вызываемого объекта. Вы можете передать ссылку на объект (или указатель) и связать ее при вызове функции:
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 предоставляет эквиваленты, если вы застряли на старой версии языка.
#define CALL_MEMBER_FN(object,ptrToMember) ((object).*(ptrToMember))
Вызов функции-члена прост, потому что вы уже есть typedef для функции, которую вы хотите вызвать.
float result = CALL_MEMBER_FN(*myA, pA)(a, b);