Я пытаюсь найти способ предоставления указателей на функции-члены между различными экземплярами классов.На данный момент я могу предоставить указатели на функцию-член, которая не принимает аргументов, но не может это сделать, когда у функции, на которую указывает указатель, есть аргумент.
Пример кода, иллюстрирующий мою проблему:
#include <iostream>
class Event
{
public:
std::string type;
Event(std::string type):type(type){}
};
class EventDispatcherBase
{
public:
void addEventListener(std::function<void(Event &event)> listener)
{
Event myEvent("Type of the myEvent object");
listener(myEvent);
}
};
class EventDispatcherClass:public EventDispatcherBase
{
public:
EventDispatcherClass()
{
addEventListener([](Event &event){std::cout << event.type << std::endl;});
//addEventListener([this]{listener(Event event);});
};
void listener(Event &event)
{
std::cout << event.type << std::endl;
}
};
int main()
{
EventDispatcherClass eventDispatcherClass;
return 0;
}
Этот код работает с анонимным лямбда-выражением и выводит «Тип объекта myEvent» в консоли.Но если я раскомментирую строку
addEventListener([this]{listener(Event event);});
в конструкторе EventDispatcherClass для передачи указателя на функцию-член void listener(Event &event)
, компилятор выдаст следующую ошибку:
нет жизнеспособного преобразования из '(лямбда в ... / main.cpp: 27: 26)' в 'std :: function'
Я не понимаю, почему.