fork download
  1. #include <iostream>
  2. #include <sstream>
  3. #include <vector>
  4. #include <algorithm>
  5. #include <functional>
  6.  
  7. template <class T, class U>
  8. class Conversion {
  9. public:
  10. Conversion(const std::function<U(const T&)>& f) : f(f) {}
  11. U convert (const T& v) const { return f(v); }
  12. private:
  13. std::function<U(const T&)> f;
  14. };
  15. template <class T>
  16. class Conversion<T,T> {
  17. public:
  18. T convert (const T& v) const { return v; }
  19. };
  20.  
  21.  
  22. template <class T>
  23. class ConvertFunctions0 : public Conversion<T,T> {};
  24.  
  25. template <class T, class V1>
  26. class ConvertFunctions1 : public Conversion<T,T>, public Conversion<T,V1> {
  27. public:
  28. ConvertFunctions1(std::function<V1(const T&)> f1) : Conversion<T,V1>(f1) {}
  29. };
  30.  
  31. template <class T, class V1, class V2>
  32. class ConvertFunctions2 : public Conversion<T,T>, public Conversion<T,V1>, public Conversion<T,V2> {
  33. public:
  34. ConvertFunctions2(std::function<V1(const T&)> f1, std::function<V2(const T&)> f2)
  35. : Conversion<T,V1>(f1), Conversion<T,V2>(f2)
  36. {}
  37. };
  38.  
  39. template <class T, class CF>
  40. class MultiUnitValue {
  41. public:
  42. MultiUnitValue(T v, const CF& cf) : v(v), cf(cf) {}
  43.  
  44. template <class U>
  45. U in() const
  46. {
  47. return cf.Conversion<T,U>::convert(v);
  48. }
  49.  
  50. private:
  51. T v;
  52. CF cf;
  53. };
  54.  
  55. int main(){
  56. auto f1 = [](int i){return i*2.54;};
  57. auto f2 = [](int i){ std::stringstream ss; ss << i; return ss.str(); };
  58. typedef ConvertFunctions2<int, float, std::string> CF_f1_f2;
  59. MultiUnitValue<int, CF_f1_f2> vv(1, CF_f1_f2(f1, f2));
  60. std::cout << vv.in<int>() << "\n";
  61. std::cout << vv.in<float>() << "\n";
  62. std::cout << vv.in<std::string>() << "\n";
  63. // std::cout << vv.in<long>() << "\n"; // error to compile
  64. }
Success #stdin #stdout 0s 3024KB
stdin
Standard input is empty
stdout
1
2.54
1