указатель на член функции

Я пытаюсь что-то сделать с указателями на функции-члены, которые я не могу понять, как это работает.

У меня есть класс А, который выглядит примерно так

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 :: Минус, но это не будет работать для меня.

Могу ли я даже сделать это?

ура

5

Решение

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

6

Другие решения

К сожалению, язык не позволяет использовать этот синтаксис для привязки объекта к функции-члену для создания вызываемого объекта. Вы можете передать ссылку на объект (или указатель) и связать ее при вызове функции:

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

Используйте макрос.

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

Вызов функции-члена прост, потому что вы уже есть typedef для функции, которую вы хотите вызвать.

float result = CALL_MEMBER_FN(*myA, pA)(a, b);
2
По вопросам рекламы [email protected]