Передать функцию-член объекта в качестве аргумента (указатель функции)

У меня есть указатель на объект «eventHandler», который имеет функцию-член «HandleButtonEvents»:

Я называю это так:

eventHandler->HandleButtonEvents();

Теперь я хочу передать указатель на функцию-член HandleButtonEvents() класса EventHandler в качестве аргумента другому объекту obj, как в этом Stackoverflow пример:

ClassXY obj = ClassXY(eventHandler->HandleButtonEvents);

Конструктор объявляется так:

ClassXY(void(*f)(void));

Компилятор мне говорит:

ошибка: неправильное использование нестатической функции-члена

Что я делаю неправильно?


person C.P.    schedule 03.11.2016    source источник
comment
Указатели на нестатические функции-члены — это не то же самое, что указатель на функцию, не являющуюся членом. Я рекомендую вам изучить std::function и std::bind вместо этого.   -  person Some programmer dude    schedule 03.11.2016
comment
Должно быть void(DecltypeEventHandler::*f)(void).   -  person skypjack    schedule 03.11.2016
comment
@skypjack: не могу использовать это, потому что я не могу включить тип в этот класс (include-loop). Вот почему я пытаюсь использовать указатель функции...   -  person C.P.    schedule 03.11.2016
comment
@C.P. Что ж, указатель на функцию и указатель на функцию-член — это действительно разные звери.   -  person skypjack    schedule 03.11.2016
comment
@skypjack: Хорошо. Я изменил вопрос. Мне нужен указатель на функцию-член (другого объекта)   -  person C.P.    schedule 03.11.2016
comment
@C.P. Чтобы указатель на член можно было использовать, С++ должен знать, членом чего он является. Если вы на самом деле не можете это обеспечить, вам нужно будет сделать свой класс и/или его конструктор template'd.   -  person Olipro    schedule 03.11.2016


Ответы (1)


Используя std::function и std::bind, как было предложено в моем комментарии, делает это очень просто:

#include <iostream>
#include <functional>

class ClassXY
{
    std::function<void()> function;

public:
    ClassXY(std::function<void()> f)
        : function(f)
    {}

    void call()
    {
        function();  // Calls the function
    }
};

class Handler
{
public:
    void HandleButtonEvent()
    {
        std::cout << "Handler::HandleButtonEvent\n";
    }
};

int main()
{
    Handler* handler = new Handler;

    ClassXY xy(std::bind(&Handler::HandleButtonEvent, handler));

    xy.call();
}

см. здесь живой пример.

person Some programmer dude    schedule 03.11.2016