#include #include using std::cout; using std::endl; class EventHandler { public: /* template void addHandler(T* owner) { cout << "Handler added..." << endl; //Let's pretend an event just occured owner->Callback(owner, 1); } */ void addHandler(std::function callback) { cout << "Handler added..." << endl; // Let's pretend an event just occured callback(1); } }; EventHandler* handler; /********************************************************************************************** * */ class MyClass { public: MyClass() { using namespace std::placeholders; private_x = 5; // handler->addHandler(this); handler->addHandler(std::bind(&MyClass::Callback, this, _1)); } void Callback(int x) { cout << x + private_x << endl; } int public_x = 12; private: int private_x; }; /********************************************************************************************** * */ class YourClass { public: YourClass() { using namespace std::placeholders; private_y = 8; handler->addHandler(std::bind(&YourClass::Callback, this, _1)); } void Callback(int x) { cout << x + private_y << endl; } private: int private_y; }; /********************************************************************************************** * */ void freeStandingCallback(int x) { cout << x << endl; } /********************************************************************************************** * */ // https://en.cppreference.com/w/cpp/language/function_template template void f(X a) { printf("Test"); } template void f(X* a) { printf("Test"); } void (*p)(int*) = &f; // https://en.cppreference.com/w/cpp/language/function_template // template void g(MyClass* a1, YourClass* a2) { printf("access both classes\n"); printf("MyClass: %d\n", a1->public_x); printf("YourClass: private\n"); } int main(int argc, char** argv) { handler = new EventHandler(); MyClass* myClass = new MyClass(); YourClass* yourClass = new YourClass(); handler->addHandler([](int x) { std::cout << "x is " << x << '\n'; }); handler->addHandler(freeStandingCallback); f(myClass->public_x); g(myClass, yourClass); }