#include<iostream>
#include<cctype>
#include<utility>
#include<cstddef>
/*
* 1. Define types, based in std::integral_constant and std::integer_sequence, to store our data
* 2. map_types_over_integer_constants (to concat the individual char-integral_constants into one pack of chars
* 3. constexpr_strlen
* 4. the macro the defines the relevant lambda, and calls the above functions
*/
template<char c>
using Char = std::integral_constant<char,c>;
template<char... c>
struct CharPack : std::integer_sequence<char, c...> {
static constexpr const char value0[] = {c...,'\0'};
template< template<char...> class Template>
using apply = Template<c...>; // This is in order to 'extract' the chars later
};
template<char... c>
constexpr const char CharPack<c...>:: value0[];
template<typename F, typename T>
struct map_types_over_integer_constants;
template<typename F, size_t... i>
struct map_types_over_integer_constants<F, std::integer_sequence<size_t, i...> > {
using type = CharPack< F::get()[i] ... >;
};
constexpr size_t constexpr_strlen(const char * s) {
return (*s=='\0')?0:(1+constexpr_strlen(s+1));
}
template<typename F>
struct map_to_each_char_in_string {
using seq1N = std:: make_index_sequence< constexpr_strlen(F::get()) >;
using type = typename map_types_over_integer_constants<F, seq1N> :: type;
};
#define COMPILE_LITERAL_STRING_TO_CHARPACK(t_name, str) \
struct t_name ## required_nested_one { \
constexpr static const char * get() { return str; } \
}; \
using t_name = map_to_each_char_in_string<t_name ## required_nested_one> :: type
/* The above lines could go in a header file, string_to_charpack.hpp or something */
using std:: cout;
using std:: endl;
template <char... c>
struct char_sequence_to_type;
template <> struct char_sequence_to_type< 'i','n','t' > { using type = int; };
template <> struct char_sequence_to_type< 'c','h','a','r' > { using type = char; };
template <> struct char_sequence_to_type< 's','t','r','i','n','g' > { using type = std:: string; };
template <char... c>
using char_sequence_to_type_t = typename char_sequence_to_type<c...>::type;
int main() {
COMPILE_LITERAL_STRING_TO_CHARPACK(compiled_hello, "hello world");
std:: cout << compiled_hello :: value0 << std:: endl;
COMPILE_LITERAL_STRING_TO_CHARPACK(compiled_i, "int");
COMPILE_LITERAL_STRING_TO_CHARPACK(compiled_c, "char");
COMPILE_LITERAL_STRING_TO_CHARPACK(compiled_s, "string");
static_assert(std::is_same< compiled_i::apply<char_sequence_to_type_t> ,int>::value, "int");
static_assert(std::is_same< compiled_c::apply<char_sequence_to_type_t> ,char>::value, "char");
static_assert(std::is_same< compiled_s::apply<char_sequence_to_type_t> ,std:: string>::value, "string");
}
I2luY2x1ZGU8aW9zdHJlYW0+CiNpbmNsdWRlPGNjdHlwZT4KI2luY2x1ZGU8dXRpbGl0eT4KI2luY2x1ZGU8Y3N0ZGRlZj4KCi8qCiAqIDEuIERlZmluZSB0eXBlcywgYmFzZWQgaW4gc3RkOjppbnRlZ3JhbF9jb25zdGFudCBhbmQgc3RkOjppbnRlZ2VyX3NlcXVlbmNlLCB0byBzdG9yZSBvdXIgZGF0YQogKiAyLiBtYXBfdHlwZXNfb3Zlcl9pbnRlZ2VyX2NvbnN0YW50cyAodG8gY29uY2F0IHRoZSBpbmRpdmlkdWFsIGNoYXItaW50ZWdyYWxfY29uc3RhbnRzIGludG8gb25lIHBhY2sgb2YgY2hhcnMKICogMy4gY29uc3RleHByX3N0cmxlbgogKiA0LiB0aGUgbWFjcm8gdGhlIGRlZmluZXMgdGhlIHJlbGV2YW50IGxhbWJkYSwgYW5kIGNhbGxzIHRoZSBhYm92ZSBmdW5jdGlvbnMKICovCgp0ZW1wbGF0ZTxjaGFyIGM+CnVzaW5nIENoYXIgPSBzdGQ6OmludGVncmFsX2NvbnN0YW50PGNoYXIsYz47Cgp0ZW1wbGF0ZTxjaGFyLi4uIGM+CnN0cnVjdCBDaGFyUGFjayA6IHN0ZDo6aW50ZWdlcl9zZXF1ZW5jZTxjaGFyLCBjLi4uPiB7CiAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgdmFsdWUwW10gPSB7Yy4uLiwnXDAnfTsKICAgIHRlbXBsYXRlPCB0ZW1wbGF0ZTxjaGFyLi4uPiBjbGFzcyBUZW1wbGF0ZT4KICAgIHVzaW5nIGFwcGx5ID0gVGVtcGxhdGU8Yy4uLj47IC8vIFRoaXMgaXMgaW4gb3JkZXIgdG8gJ2V4dHJhY3QnIHRoZSBjaGFycyBsYXRlcgp9Owp0ZW1wbGF0ZTxjaGFyLi4uIGM+CmNvbnN0ZXhwciBjb25zdCBjaGFyIENoYXJQYWNrPGMuLi4+OjogdmFsdWUwW107Cgp0ZW1wbGF0ZTx0eXBlbmFtZSBGLCB0eXBlbmFtZSBUPgpzdHJ1Y3QgbWFwX3R5cGVzX292ZXJfaW50ZWdlcl9jb25zdGFudHM7CnRlbXBsYXRlPHR5cGVuYW1lIEYsIHNpemVfdC4uLiBpPgpzdHJ1Y3QgbWFwX3R5cGVzX292ZXJfaW50ZWdlcl9jb25zdGFudHM8Riwgc3RkOjppbnRlZ2VyX3NlcXVlbmNlPHNpemVfdCwgaS4uLj4gPiB7CiAgICB1c2luZyB0eXBlID0gQ2hhclBhY2s8IEY6OmdldCgpW2ldIC4uLiA+Owp9Owpjb25zdGV4cHIgc2l6ZV90IGNvbnN0ZXhwcl9zdHJsZW4oY29uc3QgY2hhciAqIHMpIHsKICAgIHJldHVybiAoKnM9PSdcMCcpPzA6KDErY29uc3RleHByX3N0cmxlbihzKzEpKTsKfQoKdGVtcGxhdGU8dHlwZW5hbWUgRj4Kc3RydWN0IG1hcF90b19lYWNoX2NoYXJfaW5fc3RyaW5nIHsKICAgIHVzaW5nIHNlcTFOID0gc3RkOjogbWFrZV9pbmRleF9zZXF1ZW5jZTwgY29uc3RleHByX3N0cmxlbihGOjpnZXQoKSkgPjsKICAgIHVzaW5nIHR5cGUgPSB0eXBlbmFtZSBtYXBfdHlwZXNfb3Zlcl9pbnRlZ2VyX2NvbnN0YW50czxGLCBzZXExTj4gOjogdHlwZTsKfTsKCiNkZWZpbmUgQ09NUElMRV9MSVRFUkFMX1NUUklOR19UT19DSEFSUEFDSyh0X25hbWUsIHN0cikgXAogICAgc3RydWN0IHRfbmFtZSAjIyByZXF1aXJlZF9uZXN0ZWRfb25lIHsgICAgICBcCiAgICAgICAgY29uc3RleHByIHN0YXRpYyBjb25zdCBjaGFyICogZ2V0KCkgeyByZXR1cm4gc3RyOyB9ICAgICAgXAogICAgfTsgICAgICBcCiAgICB1c2luZyB0X25hbWUgPSBtYXBfdG9fZWFjaF9jaGFyX2luX3N0cmluZzx0X25hbWUgIyMgcmVxdWlyZWRfbmVzdGVkX29uZT4gOjogdHlwZQoKLyogVGhlIGFib3ZlIGxpbmVzIGNvdWxkIGdvIGluIGEgaGVhZGVyIGZpbGUsIHN0cmluZ190b19jaGFycGFjay5ocHAgb3Igc29tZXRoaW5nICovCgp1c2luZyBzdGQ6OiBjb3V0Owp1c2luZyBzdGQ6OiBlbmRsOwoKdGVtcGxhdGUgPGNoYXIuLi4gYz4Kc3RydWN0IGNoYXJfc2VxdWVuY2VfdG9fdHlwZTsKdGVtcGxhdGUgPD4gc3RydWN0IGNoYXJfc2VxdWVuY2VfdG9fdHlwZTwgJ2knLCduJywndCcgPiB7IHVzaW5nIHR5cGUgPSBpbnQ7IH07CnRlbXBsYXRlIDw+IHN0cnVjdCBjaGFyX3NlcXVlbmNlX3RvX3R5cGU8ICdjJywnaCcsJ2EnLCdyJyA+IHsgdXNpbmcgdHlwZSA9IGNoYXI7IH07CnRlbXBsYXRlIDw+IHN0cnVjdCBjaGFyX3NlcXVlbmNlX3RvX3R5cGU8ICdzJywndCcsJ3InLCdpJywnbicsJ2cnID4geyB1c2luZyB0eXBlID0gc3RkOjogc3RyaW5nOyB9Owp0ZW1wbGF0ZSA8Y2hhci4uLiBjPgp1c2luZyBjaGFyX3NlcXVlbmNlX3RvX3R5cGVfdCA9IHR5cGVuYW1lIGNoYXJfc2VxdWVuY2VfdG9fdHlwZTxjLi4uPjo6dHlwZTsKCmludCBtYWluKCkgewogICAgQ09NUElMRV9MSVRFUkFMX1NUUklOR19UT19DSEFSUEFDSyhjb21waWxlZF9oZWxsbywgImhlbGxvIHdvcmxkIik7CiAgICBzdGQ6OiBjb3V0IDw8IGNvbXBpbGVkX2hlbGxvIDo6IHZhbHVlMCA8PCBzdGQ6OiBlbmRsOwoKICAgIENPTVBJTEVfTElURVJBTF9TVFJJTkdfVE9fQ0hBUlBBQ0soY29tcGlsZWRfaSwgImludCIpOwogICAgQ09NUElMRV9MSVRFUkFMX1NUUklOR19UT19DSEFSUEFDSyhjb21waWxlZF9jLCAiY2hhciIpOwogICAgQ09NUElMRV9MSVRFUkFMX1NUUklOR19UT19DSEFSUEFDSyhjb21waWxlZF9zLCAic3RyaW5nIik7CiAgICBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfc2FtZTwgY29tcGlsZWRfaTo6YXBwbHk8Y2hhcl9zZXF1ZW5jZV90b190eXBlX3Q+ICxpbnQ+Ojp2YWx1ZSwgImludCIpOwogICAgc3RhdGljX2Fzc2VydChzdGQ6OmlzX3NhbWU8IGNvbXBpbGVkX2M6OmFwcGx5PGNoYXJfc2VxdWVuY2VfdG9fdHlwZV90PiAsY2hhcj46OnZhbHVlLCAiY2hhciIpOwogICAgc3RhdGljX2Fzc2VydChzdGQ6OmlzX3NhbWU8IGNvbXBpbGVkX3M6OmFwcGx5PGNoYXJfc2VxdWVuY2VfdG9fdHlwZV90PiAsc3RkOjogc3RyaW5nPjo6dmFsdWUsICJzdHJpbmciKTsKfQo=