Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
делегат подразумевает четкую типизацию возвращаемого значения и аргументов
A delegate is a form of type-safe function pointer
Victim test_class; Delegate test_delegate; test_delegate.Connect([&test_class] { test_class.Foo(); });
…
public:
Container( T* c, M m): m_class( c ), m_method( m ) {}
private:
T* m_class; M m_method;
};
Следовательно все что нам нужно — это извлечь тип аргумента из сигнатуры. Для этого необходимо воспользоваться трюком с частичной специализацией шаблонов
void (*)(int) // указатель на функцию
void (Myclass::*)(int) // указатель на метод класса Myclass
void (T::*)(A1) // указатель на метод произвольного класса T с типом аргумента A1
void (Myclass::* foo)(int) = 0; // без typedef
typedef void (Myclass::* M)(int);
M foo = 0; // с typedef
Простейший делегат на C++