fork(2) download
  1. #include <iostream>
  2.  
  3. // c++14 has it http://e...content-available-to-author-only...e.com/w/cpp/utility/integer_sequence
  4. namespace detail {
  5. template <int... Is> struct seq { };
  6. template <int N, int... Is> struct gen_seq : gen_seq<N - 1, N - 1, Is...> { };
  7. template <int... Is> struct gen_seq<0, Is...> : seq<Is...> { };
  8. }
  9.  
  10. constexpr size_t operator"" _len ( const char*, size_t len ){ return len; }
  11.  
  12. template < char... val > struct slit {};
  13.  
  14. #define EXPAND_STRING( type_name, str ) \
  15. template <int... Is> slit< str[Is]...> make_##type_name( detail::seq<Is...> ); \
  16. using type_name = decltype( make_##type_name( detail::gen_seq<str##_len>{} ) );
  17.  
  18. using Manual = slit< 'b', 'a', 'z'>;
  19. EXPAND_STRING( MyFoo, "foo bar baz");
  20. EXPAND_STRING( MyBar, "bla bli blo blu");
  21.  
  22. inline std::ostream& operator<<( std::ostream& os, slit<> ) { return os; }
  23. template < char first, char... chars >
  24. std::ostream& operator<<( std::ostream& os, slit<first,chars...> ) {
  25. return os << first << " " << slit<chars...>{};
  26. }
  27.  
  28. int main() {
  29. std::cout << Manual{} << "\n";
  30. std::cout << MyFoo{} << "\n";
  31. std::cout << MyBar{} << "\n";
  32. }
Success #stdin #stdout 0s 3300KB
stdin
Standard input is empty
stdout
b a z 
f o o   b a r   b a z 
b l a   b l i   b l o   b l u