#include <utility>
using namespace std;
template <char ... C>
struct string_literal {
typedef string_literal type;
static constexpr const char value[sizeof...(C)] = {C...};
constexpr operator const char* (void) const {
return value;
}
};
template <char ... C>
constexpr const char string_literal<C...>::value[sizeof...(C)];
template <unsigned N, const char (&S) [N], typename U>
struct selector;
template <unsigned N, const char (&S) [N], unsigned ...I>
struct selector<N, S, index_sequence<I...>> {
using type = string_literal<S[I]...>;
};
template <unsigned N, const char (&S) [N]>
struct make_string_literal {
using type = typename selector<N, S, make_index_sequence<N>>::type;
};
template <unsigned N>
constexpr auto size(const char (&s) [N]) {
return N;
}
extern constexpr char value[] = "test";
constexpr auto literal = make_string_literal<size(value), value>::type{};
#include <iostream>
#include <typeinfo>
int main() {
std::cout << typeid(literal).name() << '=' << literal << std::endl;
std::cout << typeid(value).name() << '=' << value << std::endl;
return 0;
}
I2luY2x1ZGUgPHV0aWxpdHk+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7Cgp0ZW1wbGF0ZSA8Y2hhciAuLi4gQz4Kc3RydWN0IHN0cmluZ19saXRlcmFsIHsKICAgIHR5cGVkZWYgc3RyaW5nX2xpdGVyYWwgdHlwZTsKICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciB2YWx1ZVtzaXplb2YuLi4oQyldID0ge0MuLi59OwogICAgY29uc3RleHByIG9wZXJhdG9yIGNvbnN0IGNoYXIqICh2b2lkKSBjb25zdCB7CiAgICAgICAgcmV0dXJuIHZhbHVlOwogICAgfQp9Owp0ZW1wbGF0ZSA8Y2hhciAuLi4gQz4KY29uc3RleHByIGNvbnN0IGNoYXIgc3RyaW5nX2xpdGVyYWw8Qy4uLj46OnZhbHVlW3NpemVvZi4uLihDKV07Cgp0ZW1wbGF0ZSA8dW5zaWduZWQgTiwgY29uc3QgY2hhciAoJlMpIFtOXSwgdHlwZW5hbWUgVT4Kc3RydWN0IHNlbGVjdG9yOwoKdGVtcGxhdGUgPHVuc2lnbmVkIE4sIGNvbnN0IGNoYXIgKCZTKSBbTl0sIHVuc2lnbmVkIC4uLkk+CnN0cnVjdCBzZWxlY3RvcjxOLCBTLCBpbmRleF9zZXF1ZW5jZTxJLi4uPj4gewogICAgdXNpbmcgdHlwZSA9IHN0cmluZ19saXRlcmFsPFNbSV0uLi4+Owp9OwoKdGVtcGxhdGUgPHVuc2lnbmVkIE4sIGNvbnN0IGNoYXIgKCZTKSBbTl0+CnN0cnVjdCBtYWtlX3N0cmluZ19saXRlcmFsIHsKICAgIHVzaW5nIHR5cGUgPSB0eXBlbmFtZSBzZWxlY3RvcjxOLCBTLCBtYWtlX2luZGV4X3NlcXVlbmNlPE4+Pjo6dHlwZTsKfTsKCnRlbXBsYXRlIDx1bnNpZ25lZCBOPgpjb25zdGV4cHIgYXV0byBzaXplKGNvbnN0IGNoYXIgKCZzKSBbTl0pIHsKICAgIHJldHVybiBOOwp9CgpleHRlcm4gY29uc3RleHByIGNoYXIgdmFsdWVbXSA9ICJ0ZXN0IjsKY29uc3RleHByIGF1dG8gbGl0ZXJhbCA9IG1ha2Vfc3RyaW5nX2xpdGVyYWw8c2l6ZSh2YWx1ZSksIHZhbHVlPjo6dHlwZXt9OwoKI2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dHlwZWluZm8+CmludCBtYWluKCkgewoJc3RkOjpjb3V0IDw8IHR5cGVpZChsaXRlcmFsKS5uYW1lKCkgPDwgJz0nIDw8IGxpdGVyYWwgPDwgc3RkOjplbmRsOwoJc3RkOjpjb3V0IDw8IHR5cGVpZCh2YWx1ZSkubmFtZSgpIDw8ICc9JyA8PCB2YWx1ZSA8PCBzdGQ6OmVuZGw7CglyZXR1cm4gMDsKfQ==