fork download
  1. #include <array>
  2. #include <iostream>
  3. #include <type_traits>
  4.  
  5. struct list_end
  6. {};
  7.  
  8. template <typename Head, typename Tail>
  9. struct typelist
  10. {};
  11.  
  12. template <unsigned I>
  13. struct unsigned_
  14. : std::integral_constant<unsigned, I>
  15. {};
  16.  
  17. template <char C>
  18. struct char_
  19. : std::integral_constant<char, C>
  20. {};
  21.  
  22. template <typename>
  23. struct length;
  24.  
  25. template <typename Head, typename Tail>
  26. struct length<typelist<Head, Tail>>
  27. : unsigned_<1 + length<Tail>::value>
  28. {};
  29.  
  30. template <typename Head>
  31. struct length<typelist<Head, list_end>>
  32. : unsigned_<1>
  33. {};
  34.  
  35. template <typename>
  36. struct c_str;
  37.  
  38. template <typename Head, typename Tail>
  39. struct c_str<typelist<Head, Tail>>
  40. {
  41. static void do_(char* p)
  42. {
  43. *p = Head::value;
  44. c_str<Tail>::do_(++p);
  45. }
  46. };
  47.  
  48. template <typename Head>
  49. struct c_str<typelist<Head, list_end>>
  50. {
  51. static void do_(char* p)
  52. {
  53. *p = Head::value;
  54. *++p = 0;
  55. }
  56. };
  57.  
  58. int main()
  59. {
  60. typedef
  61. typelist<char_<'H'>,
  62. typelist<char_<'e'>,
  63. typelist<char_<'l'>,
  64. typelist<char_<'l'>,
  65. typelist<char_<'o'>,
  66. typelist<char_<','>,
  67. typelist<char_<' '>,
  68. typelist<char_<'W'>,
  69. typelist<char_<'o'>,
  70. typelist<char_<'r'>,
  71. typelist<char_<'l'>,
  72. typelist<char_<'d'>,
  73. typelist<char_<'!'>,
  74. list_end>>>>>>>>>>>>> string;
  75.  
  76. char str[length<string>::value + 1];
  77. c_str<string>::do_(str);
  78.  
  79. std::cout << str;
  80. }
Success #stdin #stdout 0s 2928KB
stdin
Standard input is empty
stdout
Hello, World!