1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 | #include <iostream> // fwd declare class Button; class BtnCallbackBase{ public: virtual void operator()(Button*) = 0; }; template<class C> class BtnCallback : public BtnCallbackBase{ private: typedef void (C::*callback_func)(Button*); C* _object; callback_func _onclick; public: BtnCallback(C* obj, callback_func func) : _object(obj) , _onclick(func) {} virtual void operator()(Button* btn){ (_object->*_onclick)(btn); } }; class Button{ public: Button() : _onclick(0) {} void Click(){ if(_onclick != 0) (*_onclick)(this); } template<class C> void RegisterCallback(C* obj, void (C::*func)(Button*)){ // cleanup old callback, deleting null pointer is a noop delete _onclick; _onclick = new BtnCallback<C>(obj,func); } ~Button(){ delete _onclick; } private: BtnCallbackBase* _onclick; }; class MyClass{ public: void ExampleCallback(Button* btn){ std::cout << "Callback works!\n"; } }; int main(){ Button btn; MyClass test; btn.RegisterCallback(&test, &MyClass::ExampleCallback); btn.Click(); } |
I2luY2x1ZGUgPGlvc3RyZWFtPgoKLy8gZndkIGRlY2xhcmUKY2xhc3MgQnV0dG9uOwoKY2xhc3MgQnRuQ2FsbGJhY2tCYXNlewpwdWJsaWM6CiAgdmlydHVhbCB2b2lkIG9wZXJhdG9yKCkoQnV0dG9uKikgPSAwOwp9OwoKdGVtcGxhdGU8Y2xhc3MgQz4KY2xhc3MgQnRuQ2FsbGJhY2sgOiBwdWJsaWMgQnRuQ2FsbGJhY2tCYXNlewpwcml2YXRlOgogIHR5cGVkZWYgdm9pZCAoQzo6KmNhbGxiYWNrX2Z1bmMpKEJ1dHRvbiopOwogIAogIEMqIF9vYmplY3Q7CiAgY2FsbGJhY2tfZnVuYyBfb25jbGljazsKICAKcHVibGljOgogIEJ0bkNhbGxiYWNrKEMqIG9iaiwgY2FsbGJhY2tfZnVuYyBmdW5jKQogICAgOiBfb2JqZWN0KG9iaikKICAgICwgX29uY2xpY2soZnVuYykKICB7fQoKICB2aXJ0dWFsIHZvaWQgb3BlcmF0b3IoKShCdXR0b24qIGJ0bil7CiAgICAoX29iamVjdC0+Kl9vbmNsaWNrKShidG4pOwogIH0KfTsKCgpjbGFzcyBCdXR0b257CnB1YmxpYzoKICBCdXR0b24oKQogICAgOiBfb25jbGljaygwKQogIHt9CgogIHZvaWQgQ2xpY2soKXsKICAgIGlmKF9vbmNsaWNrICE9IDApCiAgICAgICgqX29uY2xpY2spKHRoaXMpOwogIH0KCiAgdGVtcGxhdGU8Y2xhc3MgQz4KICB2b2lkIFJlZ2lzdGVyQ2FsbGJhY2soQyogb2JqLCB2b2lkIChDOjoqZnVuYykoQnV0dG9uKikpewogICAgLy8gY2xlYW51cCBvbGQgY2FsbGJhY2ssIGRlbGV0aW5nIG51bGwgcG9pbnRlciBpcyBhIG5vb3AKICAgIGRlbGV0ZSBfb25jbGljazsKICAgIF9vbmNsaWNrID0gbmV3IEJ0bkNhbGxiYWNrPEM+KG9iaixmdW5jKTsKICB9CgogIH5CdXR0b24oKXsKICAgIGRlbGV0ZSBfb25jbGljazsKICB9Cgpwcml2YXRlOgogIEJ0bkNhbGxiYWNrQmFzZSogX29uY2xpY2s7Cn07CgpjbGFzcyBNeUNsYXNzewpwdWJsaWM6CiAgdm9pZCBFeGFtcGxlQ2FsbGJhY2soQnV0dG9uKiBidG4pewogICAgc3RkOjpjb3V0IDw8ICJDYWxsYmFjayB3b3JrcyFcbiI7CiAgfQp9OwoKaW50IG1haW4oKXsKICBCdXR0b24gYnRuOwogIE15Q2xhc3MgdGVzdDsKICAKICBidG4uUmVnaXN0ZXJDYWxsYmFjaygmdGVzdCwgJk15Q2xhc3M6OkV4YW1wbGVDYWxsYmFjayk7CgogIGJ0bi5DbGljaygpOwp9
-
upload with new input
-
result: Success time: 0s memory: 2856 kB returned value: 0
Callback works!


