#include <iostream>
#include <cstddef>
template < char ...>
struct string
{
static const char c_str[ ] ;
} ;
template < char ... S >
const char string< S...> :: c_str [ ] = { S..., 0 } ;
template < typename T>
struct valdef
{
typedef T value;
} ;
template < std:: size_t ...>
struct indices
{ } ;
template < std:: size_t , typename >
struct push_back;
template < std:: size_t I, std:: size_t ... II >
struct push_back< I, indices< II...>>
: valdef< indices< II..., I>>
{ } ;
template < std:: size_t N>
struct make_indices_impl
: valdef
<
typename push_back
<
N,
typename make_indices_impl< N - 1 > :: value
> :: value
>
{ } ;
template <>
struct make_indices_impl< 0 >
: valdef< indices< 0 >>
{ } ;
template < std:: size_t N>
struct make_indices
: valdef< typename make_indices_impl< N - 1 > :: value >
{ } ;
template <>
struct make_indices< 0 >
: valdef< indices<>>
{ } ;
template < char const * , typename >
struct to_meta_string_impl;
template < char const * S, std:: size_t ... I >
struct to_meta_string_impl< S, indices< I...>>
: valdef< string< S[ I] ...>>
{ } ;
template < char const * S, std:: size_t N>
struct to_meta_string
: valdef
<
typename to_meta_string_impl
<
S,
typename make_indices< N> :: value
> :: value
>
{ } ;
struct static_string
{
static constexpr char value[ ] ;
} ;
constexpr char static_string:: value [ ] = "abcdef" ;
int main( )
{
std:: cout << to_meta_string< static_string:: value , 6 > :: value :: c_str ;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8Y3N0ZGRlZj4KCnRlbXBsYXRlIDxjaGFyLi4uPgpzdHJ1Y3Qgc3RyaW5nCnsKCXN0YXRpYyBjb25zdCBjaGFyIGNfc3RyW107Cn07Cgp0ZW1wbGF0ZSA8Y2hhci4uLiBTPgpjb25zdCBjaGFyIHN0cmluZzxTLi4uPjo6Y19zdHJbXSA9IHsgUy4uLiwgMCB9OwoKdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CnN0cnVjdCB2YWxkZWYKewoJdHlwZWRlZiBUIHZhbHVlOwp9OwoKdGVtcGxhdGUgPHN0ZDo6c2l6ZV90Li4uPgpzdHJ1Y3QgaW5kaWNlcwp7fTsKCnRlbXBsYXRlIDxzdGQ6OnNpemVfdCwgdHlwZW5hbWU+CnN0cnVjdCBwdXNoX2JhY2s7Cgp0ZW1wbGF0ZSA8c3RkOjpzaXplX3QgSSwgc3RkOjpzaXplX3QuLi4gSUk+CnN0cnVjdCBwdXNoX2JhY2s8SSwgaW5kaWNlczxJSS4uLj4+Cgk6IHZhbGRlZjxpbmRpY2VzPElJLi4uLCBJPj4Ke307Cgp0ZW1wbGF0ZSA8c3RkOjpzaXplX3QgTj4Kc3RydWN0IG1ha2VfaW5kaWNlc19pbXBsCgk6IHZhbGRlZgoJPAoJCXR5cGVuYW1lIHB1c2hfYmFjawoJCTwKCQkJTiwKCQkJdHlwZW5hbWUgbWFrZV9pbmRpY2VzX2ltcGw8TiAtIDE+Ojp2YWx1ZQoJCT46OnZhbHVlCgk+Cnt9OwoKdGVtcGxhdGUgPD4Kc3RydWN0IG1ha2VfaW5kaWNlc19pbXBsPDA+Cgk6IHZhbGRlZjxpbmRpY2VzPDA+Pgp7fTsKCnRlbXBsYXRlIDxzdGQ6OnNpemVfdCBOPgpzdHJ1Y3QgbWFrZV9pbmRpY2VzCgk6IHZhbGRlZjx0eXBlbmFtZSBtYWtlX2luZGljZXNfaW1wbDxOIC0gMT46OnZhbHVlPgp7fTsKCnRlbXBsYXRlIDw+CnN0cnVjdCBtYWtlX2luZGljZXM8MD4KCTogdmFsZGVmPGluZGljZXM8Pj4Ke307Cgp0ZW1wbGF0ZSA8Y2hhciBjb25zdCosIHR5cGVuYW1lPgpzdHJ1Y3QgdG9fbWV0YV9zdHJpbmdfaW1wbDsKCnRlbXBsYXRlIDxjaGFyIGNvbnN0KiBTLCBzdGQ6OnNpemVfdC4uLiBJPgpzdHJ1Y3QgdG9fbWV0YV9zdHJpbmdfaW1wbDxTLCBpbmRpY2VzPEkuLi4+PgoJOiB2YWxkZWY8c3RyaW5nPFNbSV0uLi4+Pgp7fTsKCnRlbXBsYXRlIDxjaGFyIGNvbnN0KiBTLCBzdGQ6OnNpemVfdCBOPgpzdHJ1Y3QgdG9fbWV0YV9zdHJpbmcKCTogdmFsZGVmCgk8CgkJdHlwZW5hbWUgdG9fbWV0YV9zdHJpbmdfaW1wbAoJCTwKCQkJUywKCQkJdHlwZW5hbWUgbWFrZV9pbmRpY2VzPE4+Ojp2YWx1ZQoJCT46OnZhbHVlCgk+Cnt9OwoKc3RydWN0IHN0YXRpY19zdHJpbmcKewoJc3RhdGljIGNvbnN0ZXhwciBjaGFyIHZhbHVlW107Cn07Cgpjb25zdGV4cHIgY2hhciBzdGF0aWNfc3RyaW5nOjp2YWx1ZVtdID0gImFiY2RlZiI7CgppbnQgbWFpbigpCnsKCXN0ZDo6Y291dCA8PCB0b19tZXRhX3N0cmluZzxzdGF0aWNfc3RyaW5nOjp2YWx1ZSwgNj46OnZhbHVlOjpjX3N0cjsKfQ==
compilation info
prog.cpp:63:18: error: template parameter 'S' of type 'const char*' is not allowed in an integral constant expression because it is not of integral or enumeration type
prog.cpp:63:21: error: an array reference cannot appear in a constant-expression
prog.cpp:63:22: error: expected parameter pack before '...'
prog.cpp:63:25: error: template argument 1 is invalid
prog.cpp: In instantiation of 'to_meta_string<((const char*)(& static_string::value)), 6u>':
prog.cpp:87:54: instantiated from here
prog.cpp:76:1: error: no type named 'value' in 'struct to_meta_string_impl<((const char*)(& static_string::value)), indices<0u, 1u, 2u, 3u, 4u, 5u> >'
prog.cpp: In function 'int main()':
prog.cpp:87:56: error: 'to_meta_string<(const char*)&static_string::value, 6u>::value' has not been declared
stdout