fork download
  1. #include <iostream>
  2. #include <string>
  3. #include <tuple>
  4. #include <typeinfo>
  5.  
  6. template<std::size_t> struct int_{};
  7.  
  8. struct nil {};
  9.  
  10. template<typename T, class Tuple>
  11. struct concat_tuple_type;
  12.  
  13. template< typename T
  14. , typename T1, typename T2, typename T3
  15. , typename T4, typename T5 >
  16. struct concat_tuple_type< T, std::tuple<T1, T2, T3, T4, T5> >
  17. {
  18. typedef std::tuple<T, T1, T2, T3, T4, T5> result_type;
  19. };
  20.  
  21. template< typename T, class Tuple>
  22. typename concat_tuple_type<const T*,Tuple>::result_type concat_tuple(const T& obj, const Tuple& tuple)
  23. {
  24. typedef typename concat_tuple_type<const T*, Tuple>::result_type
  25. result_type;
  26. result_type result( obj, tuple);
  27. }
  28.  
  29. ////////////////////////////////////////////////////////////////////////////////
  30.  
  31. template<class Tuple>
  32. struct expression
  33. {
  34. Tuple expr;
  35.  
  36. expression(const Tuple& x) : expr(x) {}
  37. };
  38.  
  39. template<>
  40. struct expression<nil>
  41. {
  42. };
  43.  
  44. template<typename T, typename Tuple>
  45. expression< typename concat_tuple_type<const T*, Tuple>::result_type > operator<<(const expression<Tuple>& x, const T& obj)
  46. {
  47. typedef expression<typename concat_tuple_type<const T*, Tuple>::result_type>
  48. result_type;
  49. return result_type( concat_tuple(&obj, x.expr) );
  50. }
  51.  
  52. template<typename T>
  53. expression< std::tuple<const T*> > operator<<(const expression<nil>&, const T& obj)
  54. {
  55. return std::tuple<const T*>(&obj);
  56. }
  57.  
  58. ////////////////////////////////////////////////////////////////////////////////
  59.  
  60. template<typename Tuple, std::size_t I>
  61. void print_expression(std::ostream& os, const expression<Tuple>& x, int_<I>)
  62. {
  63. print_expression(os, x, int_<I-1>());
  64. os << ", " /*<< I << ": "*/ << *std::get<I>(x.expr);
  65. }
  66.  
  67. template<typename Tuple>
  68. void print_expression(std::ostream& os, const expression<Tuple>& x, int_<0>)
  69. {
  70. os /*<< "0: "*/ << *std::get<0>(x.expr);
  71. }
  72.  
  73. template<class Tuple>
  74. std::ostream& operator<<(std::ostream& os, const expression<Tuple>& x)
  75. {
  76. os << '(';
  77. print_expression( os, x, int_<std::tuple_size<Tuple>::value-1>() );
  78. os << ')';
  79. return os;
  80. }
  81.  
  82. ////////////////////////////////////////////////////////////////////////////////
  83.  
  84. int main()
  85. {
  86. expression<nil> lhs;
  87.  
  88. auto x = lhs << 42;
  89. //std::cout << typeid(x).name() << x << '\n';
  90. //x << 42;
  91. operator<< <int>(x, 42);
  92.  
  93. return 0;
  94. }
  95.  
Compilation error #stdin compilation error #stdout 0s 0KB
stdin
Standard input is empty
compilation info
prog.cpp: In function 'int main()':
prog.cpp:91:24: error: no matching function for call to 'operator<<(expression<std::tuple<const int*> >&, int)'
stdout
Standard output is empty