#include <iostream>
#include <string>
#include <typeinfo>
using namespace std;
template<char...C>
struct static_string
{
static std::string str()
{
return {C...};
}
};
template<std::size_t ...Indices>
struct seq {};
template<typename T, std::size_t>
struct push_back;
template<std::size_t ...Indices, std::size_t Value>
struct push_back<seq<Indices...>, Value>
{
using type = seq<Indices..., Value>;
};
template<typename T, std::size_t Value>
using push_back_t = typename push_back<T, Value>::type;
template<typename T, std::size_t Current, std::size_t Max>
struct make_sequence_impl
{
using my = push_back_t<T, Current> ;
using next = make_sequence_impl<my, Current+1, Max>;
using type = typename next::type;
};
template<typename T, std::size_t Current>
struct make_sequence_impl<T, Current, Current>
{
using type = push_back_t<T, Current> ;
};
template<std::size_t Size>
using make_sequence = typename make_sequence_impl<seq<>, 0, Size>::type;
#define STR(Str) \
struct \
{ \
using seq_t = make_sequence<sizeof(Str)-1>; \
template<std::size_t ... Indices> \
constexpr static static_string<Str[Indices]...> make(seq<Indices...>) {return {};} \
\
using type = decltype(make(seq_t())); \
}; \
using str = STR("MyString");
int main()
{
cout << typeid(make_sequence<10>).name() << endl;
cout << typeid(typename str::type).name() << endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3RyaW5nPgojaW5jbHVkZSA8dHlwZWluZm8+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7Cgp0ZW1wbGF0ZTxjaGFyLi4uQz4Kc3RydWN0IHN0YXRpY19zdHJpbmcKewoJc3RhdGljIHN0ZDo6c3RyaW5nIHN0cigpCgl7CgkJcmV0dXJuIHtDLi4ufTsKCX0KfTsKCgp0ZW1wbGF0ZTxzdGQ6OnNpemVfdCAuLi5JbmRpY2VzPgpzdHJ1Y3Qgc2VxIHt9OwoKdGVtcGxhdGU8dHlwZW5hbWUgVCwgc3RkOjpzaXplX3Q+CnN0cnVjdCBwdXNoX2JhY2s7Cgp0ZW1wbGF0ZTxzdGQ6OnNpemVfdCAuLi5JbmRpY2VzLCBzdGQ6OnNpemVfdCBWYWx1ZT4Kc3RydWN0IHB1c2hfYmFjazxzZXE8SW5kaWNlcy4uLj4sIFZhbHVlPgp7CiAgICB1c2luZyB0eXBlID0gc2VxPEluZGljZXMuLi4sIFZhbHVlPjsKfTsKCnRlbXBsYXRlPHR5cGVuYW1lIFQsIHN0ZDo6c2l6ZV90IFZhbHVlPgp1c2luZyBwdXNoX2JhY2tfdCA9IHR5cGVuYW1lIHB1c2hfYmFjazxULCBWYWx1ZT46OnR5cGU7IAoKdGVtcGxhdGU8dHlwZW5hbWUgVCwgc3RkOjpzaXplX3QgQ3VycmVudCwgc3RkOjpzaXplX3QgTWF4PgpzdHJ1Y3QgbWFrZV9zZXF1ZW5jZV9pbXBsCnsKICAgIHVzaW5nIG15ID0gcHVzaF9iYWNrX3Q8VCwgQ3VycmVudD4gOwogICAgdXNpbmcgbmV4dCA9IG1ha2Vfc2VxdWVuY2VfaW1wbDxteSwgQ3VycmVudCsxLCBNYXg+OwogICAgdXNpbmcgdHlwZSA9IHR5cGVuYW1lIG5leHQ6OnR5cGU7Cn07Cgp0ZW1wbGF0ZTx0eXBlbmFtZSBULCBzdGQ6OnNpemVfdCBDdXJyZW50PgpzdHJ1Y3QgbWFrZV9zZXF1ZW5jZV9pbXBsPFQsIEN1cnJlbnQsIEN1cnJlbnQ+CnsKICAgIHVzaW5nIHR5cGUgPSBwdXNoX2JhY2tfdDxULCBDdXJyZW50PiA7Cn07Cgp0ZW1wbGF0ZTxzdGQ6OnNpemVfdCBTaXplPiAKdXNpbmcgbWFrZV9zZXF1ZW5jZSA9IHR5cGVuYW1lIG1ha2Vfc2VxdWVuY2VfaW1wbDxzZXE8PiwgMCwgU2l6ZT46OnR5cGU7CgojZGVmaW5lIFNUUihTdHIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCnN0cnVjdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoJdXNpbmcgc2VxX3QgPSBtYWtlX3NlcXVlbmNlPHNpemVvZihTdHIpLTE+OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCgl0ZW1wbGF0ZTxzdGQ6OnNpemVfdCAuLi4gSW5kaWNlcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKCWNvbnN0ZXhwciBzdGF0aWMgc3RhdGljX3N0cmluZzxTdHJbSW5kaWNlc10uLi4+IG1ha2Uoc2VxPEluZGljZXMuLi4+KSB7cmV0dXJuIHt9O30gXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICB1c2luZyB0eXBlID0gZGVjbHR5cGUobWFrZShzZXFfdCgpKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKfTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKCnVzaW5nIHN0ciA9IFNUUigiTXlTdHJpbmciKTsKCmludCBtYWluKCkgCnsKCWNvdXQgPDwgdHlwZWlkKG1ha2Vfc2VxdWVuY2U8MTA+KS5uYW1lKCkgPDwgZW5kbDsKCWNvdXQgPDwgdHlwZWlkKHR5cGVuYW1lIHN0cjo6dHlwZSkubmFtZSgpIDw8IGVuZGw7CglyZXR1cm4gMDsKfQ==