Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Class A
- {
- public:
- void Action(){//...};
- };
- class CallBack
- {
- //...
- // CallBack it self it is a NOT a template
- // It can wrap member template though
- };
- class B
- {
- public:
- void SetCallback(CallBack to){
- m_cb = to;
- }
- void do_something()
- {
- //...
- m_cb.Execute();
- //...
- }
- private:
- CallBack m_cb;
- };
- int main()
- {
- A obj1;
- CallBack cb = make_callback(&obj1, &A::Action);
- B obj2;
- obj2.SetCallback(cb);
- //....
- obj2.do_something();
- }
- #include <iostream>
- #include <memory>
- // INTERNAL CLASSES
- class CallbackSpecBase
- {
- public:
- virtual ~CallbackSpecBase() {}
- virtual void operator()(...) const = 0;
- };
- template<class C, class T>
- class CallbackSpec : public CallbackSpecBase
- {
- public:
- CallbackSpec(C& o, T m) : obj(o), method(m) {}
- /*line 18*/ void operator()(...) const { (&obj->*method)(); } // how to pass "..." into method(...)
- private:
- C& obj;
- T method;
- };
- // PUBLIC API
- class Callback
- {
- public:
- Callback() {}
- void operator()() { (*spec)(); }
- template<class C, class T>
- void set(C& o, T m) { spec.reset(new CallbackSpec<C, T>(o, m)); }
- private:
- std::auto_ptr<CallbackSpecBase> spec;
- };
- // TEST CODE
- class Test
- {
- public:
- void foo() { std::cout << "Working" << std::endl; }
- void bar() { std::cout << "Like a charm" << std::endl; }
- };
- int main()
- {
- Test t;
- Callback c;
- c.set(t, &Test::foo);
- c();
- c.set(t, &Test::bar);
- c();
- }
- class A
- {
- public:
- void Action() {//...};
- };
- class B
- {
- public:
- template <typename Func>
- void SetCallback(Func func) {
- m_cb = func;
- }
- void do_something() {
- m_cb(); // whatever function
- }
- private:
- std::function<void()> m_cb; // anything callable with no arguments
- };
- int main()
- {
- A obj1;
- B obj2;
- obj2.SetCallback(make_callback(&obj1, &A::Action));
- // or:
- obj2.SetCallback(std::bind(&obj1, &A::Action)); // or boost::bind
- obj2.do_something();
- }
- class B
- {
- public:
- void SetCallback(CDelegate f_Delegate)
- {
- m_Delegate = f_Delegate;
- }
- static void do_something()
- {
- //...
- m_Delegate();
- //...
- }
- private:
- static CDelegate m_Delegate;
- };
- #include <memory>
- template< typename R, typename ... Args >
- class CallbackBase
- {
- public:
- typedef std::shared_ptr< CallbackBase< R, Args... > >
- CallbackPtr;
- virtual ~CallbackBase()
- {
- }
- virtual R Call( Args ... args) = 0;
- };
- template< typename R, typename ... Args >
- class FunctionCallback : public CallbackBase< R, Args... >
- {
- public:
- typedef R (*funccb)(Args...);
- FunctionCallback( funccb cb_ ) :
- CallbackBase< R, Args... >(),
- cb( cb_ )
- {
- }
- virtual ~FunctionCallback()
- {
- }
- virtual R Call(Args... args)
- {
- return cb( args... );
- }
- private:
- funccb cb;
- };
- template < typename R, typename ...Args >
- typename CallbackBase< R, Args... >::CallbackPtr
- MakeCallback( R (*cb)(Args...) )
- {
- typename CallbackBase< R, Args... >::CallbackPtr
- p( new FunctionCallback< R, Args... >( cb )
- );
- return p;
- }
- bool Foo_1args( const int & t)
- {
- return true;
- }
- int main()
- {
- auto cbObj = MakeCallback( & Foo_1args );
- }
Add Comment
Please, Sign In to add comment