fork download
  1. #include <iostream>
  2. #include <vector>
  3.  
  4. using namespace std;
  5.  
  6. enum typeData
  7. {
  8. ValueDouble,
  9. ValueFloat
  10. };
  11.  
  12. struct data
  13. {
  14. typeData TypeData;
  15. vector<double> getDoubleValues() const { return vector<double>(); }
  16. vector<float> getFloatValues() const { return vector<float>(); }
  17. };
  18.  
  19. template <typename R, typename F, typename ...Args>
  20. R Dispatch2(const data& d1, const data& d2, F f, Args&&... args)
  21. {
  22. if (d1.TypeData == ValueDouble && d2.TypeData == ValueDouble)
  23. return f(d1.getDoubleValues(), d2.getDoubleValues(), std::forward<Args>(args)...);
  24.  
  25. if (d1.TypeData == ValueDouble && d2.TypeData == ValueFloat)
  26. return f(d1.getDoubleValues(), d2.getFloatValues(), std::forward<Args>(args)...);
  27.  
  28. if (d1.TypeData == ValueFloat && d2.TypeData == ValueDouble)
  29. return f(d1.getFloatValues(), d2.getDoubleValues(), std::forward<Args>(args)...);
  30.  
  31. if (d1.TypeData == ValueFloat && d2.TypeData == ValueFloat)
  32. return f(d1.getFloatValues(), d2.getFloatValues(), std::forward<Args>(args)...);
  33. }
  34.  
  35. //usage
  36. struct Context {}; //for additional args
  37.  
  38. template <typename T>
  39. struct D3
  40. {
  41. template <typename V, typename ...Args>
  42. T operator()(const std::vector<V>& v1, const std::vector<V>& v2, Args&&... args) const { return 1; }
  43.  
  44. template <typename V1, typename V2, typename ...Args>
  45. T operator()(const std::vector<V1>& v1, const std::vector<V2>& v2, Args&&... args) const { return 2; }
  46. };
  47.  
  48. int main()
  49. {
  50. data d1;
  51. d1.TypeData = ValueDouble;
  52.  
  53. data d2;
  54. d2.TypeData = ValueFloat;
  55.  
  56. Context ctx;
  57.  
  58. int h1 = Dispatch2<int>(d1, d2, D3<int>(), ctx);
  59. cout << "h1 = " << h1 << endl;
  60.  
  61. d1.TypeData = ValueFloat;
  62. int h2 = Dispatch2<int>(d1, d2, D3<int>(), ctx);
  63. cout << "h2 = " << h2 << endl;
  64. return 0;
  65. }
Success #stdin #stdout 0s 3096KB
stdin
Standard input is empty
stdout
h1 = 2
h2 = 1