fork download
  1. #include <iostream>
  2. using namespace std;
  3.  
  4. // -------------------------------------
  5. // Executer
  6. template <class T, class M0, class M1> class Executer {
  7. public:
  8. void operator()(T &klass) {
  9. cout << "execute: " << klass.i << endl;
  10. M0()(klass);
  11. M1()(klass);
  12. }
  13. };
  14. // -------------------------------------
  15. // Method0
  16. template <class T> class Method0 {
  17. public:
  18. void operator()(T &klass);
  19. };
  20. // -------------------------------------
  21. // CommonMethod1
  22. template <class T> class CommonMethod1 {
  23. public:
  24. void operator()(T &klass) {
  25. cout << "\tMethod1 for Klass0 and Klass1: " << klass.i << endl;
  26. }
  27. };
  28.  
  29. // -------------------------------------
  30. // Klass0
  31. class Klass0 {
  32. using this_t = Klass0;
  33. using executer_t = Executer<this_t, Method0<this_t>, CommonMethod1<this_t>>;
  34. friend executer_t;
  35. friend class Method0<this_t>;
  36. friend class CommonMethod1<this_t>;
  37.  
  38. public:
  39. Klass0(int j) : i(j) {}
  40. void execute() { executer_t()(*this); }
  41.  
  42. private:
  43. int i;
  44. };
  45. // -------------------------------------
  46. // Method0<Klass0>
  47. template <> void Method0<Klass0>::operator()(Klass0 &klass) {
  48. cout << "\tMethod0 for Klass0: " << klass.i << endl;
  49. }
  50.  
  51. // -------------------------------------
  52. // Klass1
  53. class Klass1 {
  54. using this_t = Klass1;
  55. using executer_t = Executer<this_t, Method0<this_t>, CommonMethod1<this_t>>;
  56. friend executer_t;
  57. friend class Method0<this_t>;
  58. friend class CommonMethod1<this_t>;
  59.  
  60. public:
  61. Klass1(int j) : i(j) {}
  62. void execute() { executer_t()(*this); }
  63.  
  64. private:
  65. int i;
  66. };
  67. // -------------------------------------
  68. // Method0<Klass1>
  69. template <> void Method0<Klass1>::operator()(Klass1 &klass) {
  70. cout << "\tMethod0 for Klass1: " << klass.i << endl;
  71. }
  72.  
  73. // -------------------------------------
  74. int main() {
  75. Klass0(0).execute();
  76. Klass1(1).execute();
  77. }
  78.  
Success #stdin #stdout 0s 4320KB
stdin
Standard input is empty
stdout
execute: 0
	Method0 for Klass0: 0
	Method1 for Klass0 and Klass1: 0
execute: 1
	Method0 for Klass1: 1
	Method1 for Klass0 and Klass1: 1