#include <array>
#include <iostream>
#include <type_traits>
struct list_end
{};
template <typename Head, typename Tail>
struct typelist
{};
template <unsigned I>
struct unsigned_
: std::integral_constant<unsigned, I>
{};
template <char C>
struct char_
: std::integral_constant<char, C>
{};
template <typename>
struct length;
template <typename Head, typename Tail>
struct length<typelist<Head, Tail>>
: unsigned_<1 + length<Tail>::value>
{};
template <typename Head>
struct length<typelist<Head, list_end>>
: unsigned_<1>
{};
template <typename>
struct c_str;
template <typename Head, typename Tail>
struct c_str<typelist<Head, Tail>>
{
static void do_(char* p)
{
*p = Head::value;
c_str<Tail>::do_(++p);
}
};
template <typename Head>
struct c_str<typelist<Head, list_end>>
{
static void do_(char* p)
{
*p = Head::value;
*++p = 0;
}
};
int main()
{
typedef
typelist<char_<'H'>,
typelist<char_<'e'>,
typelist<char_<'l'>,
typelist<char_<'l'>,
typelist<char_<'o'>,
typelist<char_<','>,
typelist<char_<' '>,
typelist<char_<'W'>,
typelist<char_<'o'>,
typelist<char_<'r'>,
typelist<char_<'l'>,
typelist<char_<'d'>,
typelist<char_<'!'>,
list_end>>>>>>>>>>>>> string;
char str[length<string>::value + 1];
c_str<string>::do_(str);
std::cout << str;
}
I2luY2x1ZGUgPGFycmF5PgojaW5jbHVkZSA8aW9zdHJlYW0+CiNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KCnN0cnVjdCBsaXN0X2VuZAp7fTsKCnRlbXBsYXRlIDx0eXBlbmFtZSBIZWFkLCB0eXBlbmFtZSBUYWlsPgpzdHJ1Y3QgdHlwZWxpc3QKe307Cgp0ZW1wbGF0ZSA8dW5zaWduZWQgST4Kc3RydWN0IHVuc2lnbmVkXwoJOiBzdGQ6OmludGVncmFsX2NvbnN0YW50PHVuc2lnbmVkLCBJPgp7fTsKCnRlbXBsYXRlIDxjaGFyIEM+CnN0cnVjdCBjaGFyXwoJOiBzdGQ6OmludGVncmFsX2NvbnN0YW50PGNoYXIsIEM+Cnt9OwoKdGVtcGxhdGUgPHR5cGVuYW1lPgpzdHJ1Y3QgbGVuZ3RoOwoKdGVtcGxhdGUgPHR5cGVuYW1lIEhlYWQsIHR5cGVuYW1lIFRhaWw+CnN0cnVjdCBsZW5ndGg8dHlwZWxpc3Q8SGVhZCwgVGFpbD4+Cgk6IHVuc2lnbmVkXzwxICsgbGVuZ3RoPFRhaWw+Ojp2YWx1ZT4Ke307Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgSGVhZD4Kc3RydWN0IGxlbmd0aDx0eXBlbGlzdDxIZWFkLCBsaXN0X2VuZD4+Cgk6IHVuc2lnbmVkXzwxPgp7fTsKCnRlbXBsYXRlIDx0eXBlbmFtZT4Kc3RydWN0IGNfc3RyOwoKdGVtcGxhdGUgPHR5cGVuYW1lIEhlYWQsIHR5cGVuYW1lIFRhaWw+CnN0cnVjdCBjX3N0cjx0eXBlbGlzdDxIZWFkLCBUYWlsPj4KewoJc3RhdGljIHZvaWQgZG9fKGNoYXIqIHApCgl7CgkJKnAgPSBIZWFkOjp2YWx1ZTsKCQljX3N0cjxUYWlsPjo6ZG9fKCsrcCk7Cgl9Cn07Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgSGVhZD4Kc3RydWN0IGNfc3RyPHR5cGVsaXN0PEhlYWQsIGxpc3RfZW5kPj4KewoJc3RhdGljIHZvaWQgZG9fKGNoYXIqIHApCgl7CgkJKnAgPSBIZWFkOjp2YWx1ZTsKCQkqKytwID0gMDsKCX0KfTsKCmludCBtYWluKCkKewoJdHlwZWRlZgoJdHlwZWxpc3Q8Y2hhcl88J0gnPiwKCXR5cGVsaXN0PGNoYXJfPCdlJz4sCgl0eXBlbGlzdDxjaGFyXzwnbCc+LAoJdHlwZWxpc3Q8Y2hhcl88J2wnPiwKCXR5cGVsaXN0PGNoYXJfPCdvJz4sCgl0eXBlbGlzdDxjaGFyXzwnLCc+LAoJdHlwZWxpc3Q8Y2hhcl88JyAnPiwKCXR5cGVsaXN0PGNoYXJfPCdXJz4sCgl0eXBlbGlzdDxjaGFyXzwnbyc+LAoJdHlwZWxpc3Q8Y2hhcl88J3InPiwKCXR5cGVsaXN0PGNoYXJfPCdsJz4sCgl0eXBlbGlzdDxjaGFyXzwnZCc+LAoJdHlwZWxpc3Q8Y2hhcl88JyEnPiwKCWxpc3RfZW5kPj4+Pj4+Pj4+Pj4+PiBzdHJpbmc7CgoJY2hhciBzdHJbbGVuZ3RoPHN0cmluZz46OnZhbHVlICsgMV07CgljX3N0cjxzdHJpbmc+Ojpkb18oc3RyKTsKCglzdGQ6OmNvdXQgPDwgc3RyOwp9