fork download
  1. #include <typeinfo>
  2. #include <typeindex>
  3. #include <unordered_map>
  4. #include <iostream>
  5.  
  6. using namespace std;
  7.  
  8. template <typename R>
  9. class MultiFuncObject {
  10. unordered_map<type_index, void (*)()> m_funcs;
  11. public:
  12.  
  13. MultiFuncObject<R> operator +=( R (* f)() ) {
  14. m_funcs[typeid( R() )] = (void (*)()) f;
  15. return *this;
  16. }
  17.  
  18. template <typename A1>
  19. MultiFuncObject<R> operator +=( R (* f)(A1) ) {
  20. m_funcs[typeid( R(A1) )] = (void (*)()) f;
  21. return *this;
  22. }
  23.  
  24. template <typename A1, typename A2>
  25. MultiFuncObject<R> operator +=( R (* f)(A1, A2) ) {
  26. m_funcs[typeid( R(A1, A2) )] = (void (*)()) f;
  27. return *this;
  28. }
  29.  
  30. template <typename A1, typename A2, typename A3>
  31. MultiFuncObject<R> operator +=( R (* f)(A1, A2, A3) ) {
  32. m_funcs[typeid( R(A1, A2, A3) )] = (void (*)()) f;
  33. return *this;
  34. }
  35.  
  36. R operator()() const
  37. {
  38. unordered_map<type_index, void (*)()>::const_iterator it = m_funcs.find(typeid( R() ));
  39. if (it != m_funcs.end()) {
  40. R (*f)() = ( R (*)() )(it->second);
  41. (*f)();
  42. }
  43. }
  44.  
  45. template <typename A1>
  46. R operator()(A1 a1) const
  47. {
  48. unordered_map<type_index, void (*)()>::const_iterator it = m_funcs.find(typeid( R(A1) ));
  49. if (it != m_funcs.end()) {
  50. R (*f)(A1) = ( R (*)(A1) )(it->second);
  51. (*f)(a1);
  52. }
  53. }
  54.  
  55. template <typename A1, typename A2>
  56. R operator()(A1 a1, A2 a2) const
  57. {
  58. unordered_map<type_index, void (*)()>::const_iterator it = m_funcs.find(typeid( R(A1, A2) ));
  59. if (it != m_funcs.end()) {
  60. R (*f)(A1, A2) = ( R (*)(A1, A2) )(it->second);
  61. (*f)(a1, a2);
  62. }
  63. }
  64.  
  65. template <typename A1, typename A2, typename A3>
  66. R operator()(A1 a1, A2 a2, A3 a3) const
  67. {
  68. unordered_map<type_index, void (*)()>::const_iterator it = m_funcs.find(typeid( R(A1, A2, A3) ));
  69. if (it != m_funcs.end()) {
  70. R (*f)(A1, A2, A3) = ( R (*)(A1, A2, A3) )(it->second);
  71. (*f)(a1, a2, a3);
  72. }
  73. }
  74.  
  75. };
  76.  
  77. void _1() {
  78. cout << "_1" << endl;
  79. }
  80.  
  81. void _2(char x) {
  82. cout << "_2" << " " << x << endl;
  83. }
  84.  
  85. void _3(int x) {
  86. cout << "_3" << " " << x << endl;
  87. }
  88.  
  89. void _4(double x) {
  90. cout << "_4" << " " << x << endl;
  91. }
  92.  
  93. void _5(int a, int b) {
  94. cout << "_5" << " " << a << " " << b << endl;
  95. }
  96.  
  97. void _6(char a, int b) {
  98. cout << "_6" << " " << a << " " << b << endl;
  99. }
  100.  
  101. void _7(int a, int b, int c) {
  102. cout << "_7" << " " << a << " " << b << " " << c << endl;
  103. }
  104.  
  105. int main() {
  106. MultiFuncObject<void> funcs;
  107. funcs += &_1;
  108. funcs += &_2;
  109. funcs += &_3;
  110. funcs += &_4;
  111. funcs += &_5;
  112. funcs += &_6;
  113. funcs += &_7;
  114. funcs();
  115. funcs('a');
  116. funcs(56);
  117. funcs(5.5);
  118. funcs(2, 5);
  119. funcs('q', 6);
  120. funcs(1, 2, 3);
  121. return 0;
  122. }
  123.  
  124.  
Success #stdin #stdout 0s 3464KB
stdin
Standard input is empty
stdout
_1
_2 a
_3 56
_4 5.5
_5 2 5
_6 q 6
_7 1 2 3