fork download
  1. #include <iostream>
  2.  
  3. struct A{
  4. typedef void (*callback_type)(void*, int);
  5. callback_type callback;
  6. void* user_data;
  7. void set_callback(callback_type cb, void* ud){
  8. callback = cb; user_data = ud;
  9. }
  10. void invoke(){ callback(user_data, 42); }
  11. };
  12.  
  13. struct B{
  14. static void cb_foo(void* vself, int data){
  15. B* self = static_cast<B*>(vself);
  16. self->foo(data);
  17. }
  18. void foo(int data){ std::cout << data * 2 << "\n"; }
  19. };
  20.  
  21. struct C{
  22. static void cb_bar(void* vself, int data){
  23. C* self = static_cast<C*>(vself);
  24. self->bar(data);
  25. }
  26. void bar(int data){ std::cout << data / 2 << "\n"; }
  27. };
  28.  
  29. int main(){
  30. A a;
  31. B b;
  32. a.set_callback(&B::cb_foo, &b);
  33. a.invoke();
  34. C c;
  35. a.set_callback(&C::cb_bar, &c);
  36. a.invoke();
  37. }
  38.  
Success #stdin #stdout 0.01s 2680KB
stdin
Standard input is empty
stdout
84
21