fork download
  1. #include <stdio.h>
  2. #include <iostream>
  3. #include <vector>
  4. #include <functional>
  5. using namespace std;
  6.  
  7. #define D2M(NAME,FUNC) \
  8. template <typename T> \
  9. struct NAME \
  10. {\
  11.   template <typename V1, typename V2, typename ...Args> \
  12.   T operator()(const std::vector<V1>& v1, const std::vector<V2>& v2, Args&&... args) const { return FUNC(v1, v2, std::forward<Args>(args)...); }\
  13. }
  14.  
  15. #define D1M(FUNC) \
  16. template <typename T> \
  17. struct NAME \
  18. {\
  19.   template <typename V1, typename ...Args> \
  20.   T operator()(const std::vector<V1>& v1, Args&&... args) const { return FUNC(v1, std::forward<Args>(args)...); }\
  21. }
  22.  
  23. enum typeData
  24. {
  25. ValueDouble,
  26. ValueFloat
  27. };
  28.  
  29. struct data
  30. {
  31. typeData TypeData;
  32. vector<double> getDoubleValues() const { return vector<double>(); }
  33. vector<float> getFloatValues() const { return vector<float>(); }
  34. };
  35.  
  36. template <typename R, typename F, typename ...Args>
  37. R Dispatch2(const data& d1, const data& d2, F f, Args&&... args)
  38. {
  39. if (d1.TypeData == ValueDouble && d2.TypeData == ValueDouble)
  40. return f(d1.getDoubleValues(), d2.getDoubleValues(), std::forward<Args>(args)...);
  41.  
  42. if (d1.TypeData == ValueDouble && d2.TypeData == ValueFloat)
  43. return f(d1.getDoubleValues(), d2.getFloatValues(), std::forward<Args>(args)...);
  44.  
  45. if (d1.TypeData == ValueFloat && d2.TypeData == ValueDouble)
  46. return f(d1.getFloatValues(), d2.getDoubleValues(), std::forward<Args>(args)...);
  47.  
  48. if (d1.TypeData == ValueFloat && d2.TypeData == ValueFloat)
  49. return f(d1.getFloatValues(), d2.getFloatValues(), std::forward<Args>(args)...);
  50. }
  51.  
  52. template <typename R, typename F, typename ...Args>
  53. R Dispatch(const data& d1, F f, Args&&... args)
  54. {
  55. if (d1.TypeData == ValueDouble)
  56. return f(d1.getDoubleValues(), std::forward<Args>(args)...);
  57.  
  58. if (d1.TypeData == ValueFloat)
  59. return f(d1.getFloatValues(), std::forward<Args>(args)...);
  60. }
  61.  
  62. //usage
  63. struct Context {}; //for additional args
  64. int func2(const std::vector<double>& v1, const std::vector<double>& v2, const Context& ctx)
  65. {
  66. return 1;
  67. }
  68.  
  69. int func2(const std::vector<double>& v1, const std::vector<float>& v2, const Context& ctx)
  70. {
  71. return 2;
  72. }
  73.  
  74. int func2(const std::vector<float>& v1, const std::vector<double>& v2, const Context& ctx)
  75. {
  76. return 3;
  77. }
  78.  
  79. int func2(const std::vector<float>& v1, const std::vector<float>& v2, const Context& ctx)
  80. {
  81. return 4;
  82. }
  83.  
  84.  
  85. D2M(Dfic,func2);
  86.  
  87. int main()
  88. {
  89. data d1;
  90. d1.TypeData = ValueDouble;
  91.  
  92. data d2;
  93. d2.TypeData = ValueFloat;
  94.  
  95. Context ctx;
  96.  
  97. int h1 = Dispatch2<int>(d1, d2, Dfic<int>(), ctx);
  98. cout << "h1 = " << h1 << endl;
  99.  
  100. d1.TypeData = ValueFloat;
  101. int h2 = Dispatch2<int>(d1, d2, Dfic<int>(), ctx);
  102. cout << "h2 = " << h2 << endl;
  103. return 0;
  104. }
Success #stdin #stdout 0s 3096KB
stdin
Standard input is empty
stdout
h1 = 2
h2 = 4