fork download
  1. #include <iostream>
  2. #include <list>
  3. #include <functional>
  4. #include <algorithm>
  5.  
  6. class A
  7. {
  8. public:
  9. virtual void link (A&) = 0;
  10. virtual void link (A*) = 0;
  11. virtual std::function<void(int)> getFunction2SetProperty () = 0;
  12. };
  13.  
  14. class B: public A
  15. {
  16. public:
  17. virtual void prop1 (int i)
  18. {
  19. std::cout << "B::" << __func__ << ",i=" << i << std::endl;
  20. send(i);
  21. };
  22.  
  23. virtual void link (A* those) override
  24. {
  25. sendList.push_back (those->getFunction2SetProperty ());
  26. };
  27. virtual void link (A& those) override
  28. {
  29. link (&those);
  30. };
  31.  
  32. virtual std::function<void(int)> getFunction2SetProperty () override
  33. {
  34. return std::bind (&B::prop1, this, std::placeholders::_1);
  35. };
  36.  
  37.  
  38. protected:
  39. virtual void send (int i)
  40. {
  41. for (std::function<void(int)>& f : sendList) f(i);
  42. };
  43.  
  44. std::list<std::function<void(int)>> sendList;
  45. };
  46.  
  47. class BB: public B
  48. {
  49. public:
  50. virtual void prop1 (int i) override
  51. {
  52. std::cout << "BB::" << __func__ << ",i=" << i << std::endl;
  53. send(i);
  54. };
  55. };
  56.  
  57.  
  58. class C: public A
  59. {
  60. public:
  61. virtual void propInteger (int i)
  62. {
  63. std::cout << "C::" << __func__ << ", i=" << i << std::endl;
  64. send(i);
  65. };
  66.  
  67. virtual void link (A* those) override
  68. {
  69. sendList.push_back (those->getFunction2SetProperty ());
  70. };
  71. virtual void link (A& those) override
  72. {
  73. link (&those);
  74. };
  75.  
  76. virtual std::function<void(int)> getFunction2SetProperty () override
  77. {
  78. return std::bind (&C::propInteger, this, std::placeholders::_1);
  79. };
  80.  
  81. protected:
  82. virtual void send (int i)
  83. {
  84. for (std::function<void(int)>& f : sendList) f(i);
  85. };
  86.  
  87. std::list<std::function<void(int)>> sendList;
  88. };
  89.  
  90. class CC: public C
  91. {
  92. public:
  93. virtual void propInteger (int i) override
  94. {
  95. std::cout << "CC::" << __func__ << ", i=" << i << std::endl;
  96. send (i);
  97. };
  98. };
  99.  
  100. int
  101. main ()
  102. {
  103. A* a1 = new BB;
  104. A* a2 = new CC;
  105.  
  106. a1->link (a2);
  107. std::function<void(int)> f = a1->getFunction2SetProperty ();
  108. f(123);
  109. delete a1;
  110. delete a2;
  111.  
  112. return 0;
  113. };
Success #stdin #stdout 0s 3476KB
stdin
Standard input is empty
stdout
BB::prop1,i=123
CC::propInteger, i=123