fork download
  1. #include <iostream>
  2.  
  3. #define TMPL_EXPAND(T) TMPL_CALL(TMPL_EXPAND_ ## T TMPL_E)
  4. #define TMPL_CALL(T) T
  5. #define TMPL_CALL_EXPAND TMPL_EXPAND2
  6.  
  7. #define TMPL_EXPAND2(T) TMPL_CALL2(TMPL_EXPAND2_ ## T TMPL_E)
  8. #define TMPL_CALL2(T) T
  9. #define TMPL_CALL_EXPAND2 TMPL_EXPAND3
  10.  
  11. #define TMPL_EXPAND3(T) TMPL_CALL3(TMPL_EXPAND3_ ## T TMPL_E)
  12. #define TMPL_CALL3(T) T
  13. #define TMPL_CALL_EXPAND3 TMPL_EXPAND4
  14.  
  15. #define TMPL_EXPAND4(T) TMPL_CALL4(TMPL_EXPAND3_ ## T TMPL_E)
  16. #define TMPL_CALL4(T) T
  17.  
  18. #define TMPL_O (
  19. #define TMPL_E )
  20.  
  21. #define TMPL_EXPAND_stop_now typename = void(
  22. #define TMPL_EXPAND_T typename T , TMPL_CALL_EXPAND TMPL_O
  23. #define TMPL_EXPAND_T1 typename T1, TMPL_CALL_EXPAND TMPL_O
  24. #define TMPL_EXPAND_T2 typename T2, TMPL_CALL_EXPAND TMPL_O
  25. #define TMPL_EXPAND_U typename U , TMPL_CALL_EXPAND TMPL_O
  26. #define TMPL_EXPAND_S typename S , TMPL_CALL_EXPAND TMPL_O
  27. #define TMPL_EXPAND_int_I int I , TMPL_CALL_EXPAND TMPL_O
  28.  
  29. #define TMPL_EXPAND2_stop_now typename = void(
  30. #define TMPL_EXPAND2_T typename T , TMPL_CALL_EXPAND2 TMPL_O
  31. #define TMPL_EXPAND2_T1 typename T1, TMPL_CALL_EXPAND2 TMPL_O
  32. #define TMPL_EXPAND2_T2 typename T2, TMPL_CALL_EXPAND2 TMPL_O
  33. #define TMPL_EXPAND2_U typename U , TMPL_CALL_EXPAND2 TMPL_O
  34. #define TMPL_EXPAND2_S typename S , TMPL_CALL_EXPAND2 TMPL_O
  35. #define TMPL_EXPAND2_int_I int I , TMPL_CALL_EXPAND2 TMPL_O
  36.  
  37. #define TMPL_EXPAND3_stop_now typename = void(
  38. #define TMPL_EXPAND3_T typename T , TMPL_CALL_EXPAND3 TMPL_O
  39. #define TMPL_EXPAND3_T1 typename T1, TMPL_CALL_EXPAND3 TMPL_O
  40. #define TMPL_EXPAND3_T2 typename T2, TMPL_CALL_EXPAND3 TMPL_O
  41. #define TMPL_EXPAND3_U typename U , TMPL_CALL_EXPAND3 TMPL_O
  42. #define TMPL_EXPAND3_S typename S , TMPL_CALL_EXPAND3 TMPL_O
  43. #define TMPL_EXPAND3_int_I int I , TMPL_CALL_EXPAND3 TMPL_O
  44.  
  45. #define TMPL(T) template < TMPL_EXPAND(T stop_now) >
  46.  
  47. TMPL(int_I)
  48. int int_id() { return I; }
  49.  
  50. TMPL(T)
  51. T default_value() { return T{}; }
  52.  
  53. TMPL(T S U)
  54. T sum(S const& s, U const& u) { return s+u; }
  55.  
  56. int main()
  57. {
  58. std::cout << int_id<3>() << '\n';
  59. std::cout << default_value<double>() << '\n';
  60. std::cout << sum<long double>(1.0, 2.1f) << '\n';
  61. }
Success #stdin #stdout 0s 2928KB
stdin
Standard input is empty
stdout
3
0
3.1