fork download
  1. #include <array>
  2.  
  3. template< std::size_t len >
  4. struct str_wrap : std::array< char, len > {
  5. typedef char (& arr_t)[ len ];
  6. operator arr_t () { return reinterpret_cast< char (&)[ len ] >( * this->data() ); }
  7. operator arr_t const () const { return reinterpret_cast< char const (&)[ len ] >( * this->data() ); }
  8. };
  9.  
  10. template< std::size_t lhs_len, std::size_t rhs_len >
  11. constexpr str_wrap< lhs_len + rhs_len - 1 > const cat( char const (&lhs)[ lhs_len ], char const (&rhs)[ rhs_len ] ) {
  12. return {};
  13. }
  14.  
  15. template< std::size_t lhs_len, std::size_t rhs_len >
  16. constexpr str_wrap< lhs_len + rhs_len - 1 > const cat( str_wrap< lhs_len >, char const (&rhs)[ rhs_len ] ) {
  17. return {};
  18. }
  19.  
  20. template< std::size_t lhs_len, std::size_t rhs_len >
  21. constexpr str_wrap< lhs_len + rhs_len - 1 > const cat( char const (&lhs)[ lhs_len ], str_wrap< rhs_len > ) {
  22. return {};
  23. }
  24.  
  25. int main() {
  26. cat( "a", cat( "bcd", "ef" ) );
  27. }
  28.  
  29.  
Compilation error #stdin compilation error #stdout 0s 0KB
stdin
Standard input is empty
compilation info
prog.cpp: In function 'const str_wrap<((lhs_len + rhs_len) - 1)> cat(const char (&)[lhs_len], const char (&)[rhs_len]) [with unsigned int lhs_len = 4u, unsigned int rhs_len = 3u]':
prog.cpp:26:28:   instantiated from here
prog.cpp:11:51: error: parameter 'const char (& lhs)[4]' is not of literal type
prog.cpp: In function 'const str_wrap<((lhs_len + rhs_len) - 1)> cat(const char (&)[lhs_len], str_wrap<rhs_len>) [with unsigned int lhs_len = 2u, unsigned int rhs_len = 6u]':
prog.cpp:26:30:   instantiated from here
prog.cpp:21:51: error: parameter 'const char (& lhs)[2]' is not of literal type
stdout
Standard output is empty