Вы можете найти простое использование функции std :: function.Таким образом, клиенты могут реализовать свои классы, однако они считают нужным, а не вынуждены использовать наследование.
Это также предпочтительнее, чем обратный вызов в стиле C, который часто требует указатель void*
«пользовательских данных»,способен правильно работать с классами, которые хотят использовать функцию-член.
Вы можете использовать лямбду для захвата любого нужного вам состояния и позволить интерфейсу обратного вызова отражать только то, что имеет отношение к уведомлению.Должно быть так просто, как-то так:
#include <functional>
typedef std::function<void()> CallbackType;
struct Example
{
void CallbackHandler()
{
/* do something */
}
};
void FreeFunctionHandler()
{
/* do something */
}
// Use lambda to call member function of 'example'
Example example;
CallbackType callback1 = [&example]() { example.CallbackHandler(); };
// Use free function
CallbackType callback2 = FreeFunctionHandler;
// Execute callbacks
callback1();
callback2();