#include <array>
template < std:: size_t len >
struct str_wrap : std:: array < char , len > {
typedef char ( & arr_t) [ len ] ;
operator arr_t ( ) { return reinterpret_cast < char ( & ) [ len ] > ( * this- > data( ) ) ; }
operator arr_t const ( ) const { return reinterpret_cast < char const ( & ) [ len ] > ( * this- > data( ) ) ; }
} ;
template < std:: size_t lhs_len, std:: size_t rhs_len >
constexpr str_wrap< lhs_len + rhs_len - 1 > const cat( char const ( & lhs) [ lhs_len ] , char const ( & rhs) [ rhs_len ] ) {
return { } ;
}
template < std:: size_t lhs_len, std:: size_t rhs_len >
constexpr str_wrap< lhs_len + rhs_len - 1 > const cat( str_wrap< lhs_len > , char const ( & rhs) [ rhs_len ] ) {
return { } ;
}
template < std:: size_t lhs_len, std:: size_t rhs_len >
constexpr str_wrap< lhs_len + rhs_len - 1 > const cat( char const ( & lhs) [ lhs_len ] , str_wrap< rhs_len > ) {
return { } ;
}
int main( ) {
cat( "a" , cat( "bcd" , "ef" ) ) ;
}
I2luY2x1ZGUgPGFycmF5PgoKdGVtcGxhdGU8IHN0ZDo6c2l6ZV90IGxlbiA+CnN0cnVjdCBzdHJfd3JhcCA6IHN0ZDo6YXJyYXk8IGNoYXIsIGxlbiA+IHsKICAgIHR5cGVkZWYgY2hhciAoJiBhcnJfdClbIGxlbiBdOwogICAgb3BlcmF0b3IgYXJyX3QgKCkgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDwgY2hhciAoJilbIGxlbiBdID4oICogdGhpcy0+ZGF0YSgpICk7IH0KICAgIG9wZXJhdG9yIGFycl90IGNvbnN0ICgpIGNvbnN0IHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8IGNoYXIgY29uc3QgKCYpWyBsZW4gXSA+KCAqIHRoaXMtPmRhdGEoKSApOyB9Cn07Cgp0ZW1wbGF0ZTwgc3RkOjpzaXplX3QgbGhzX2xlbiwgc3RkOjpzaXplX3QgcmhzX2xlbiA+CmNvbnN0ZXhwciBzdHJfd3JhcDwgbGhzX2xlbiArIHJoc19sZW4gLSAxID4gY29uc3QgY2F0KCBjaGFyIGNvbnN0ICgmbGhzKVsgbGhzX2xlbiBdLCBjaGFyIGNvbnN0ICgmcmhzKVsgcmhzX2xlbiBdICkgewogICAgICAgIHJldHVybiB7fTsKfQoKdGVtcGxhdGU8IHN0ZDo6c2l6ZV90IGxoc19sZW4sIHN0ZDo6c2l6ZV90IHJoc19sZW4gPgpjb25zdGV4cHIgc3RyX3dyYXA8IGxoc19sZW4gKyByaHNfbGVuIC0gMSA+IGNvbnN0IGNhdCggc3RyX3dyYXA8IGxoc19sZW4gPiwgY2hhciBjb25zdCAoJnJocylbIHJoc19sZW4gXSApIHsKICAgICAgICByZXR1cm4ge307Cn0KCnRlbXBsYXRlPCBzdGQ6OnNpemVfdCBsaHNfbGVuLCBzdGQ6OnNpemVfdCByaHNfbGVuID4KY29uc3RleHByIHN0cl93cmFwPCBsaHNfbGVuICsgcmhzX2xlbiAtIDEgPiBjb25zdCBjYXQoIGNoYXIgY29uc3QgKCZsaHMpWyBsaHNfbGVuIF0sIHN0cl93cmFwPCByaHNfbGVuID4gKSB7CiAgICAgICAgcmV0dXJuIHt9Owp9CgppbnQgbWFpbigpIHsKY2F0KCAiYSIsIGNhdCggImJjZCIsICJlZiIgKSApOwp9Cgo=
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