#include <iostream>
// c++14 has it http://e...content-available-to-author-only...e.com/w/cpp/utility/integer_sequence
namespace detail {
template <int... Is> struct seq { };
template <int N, int... Is> struct gen_seq : gen_seq<N - 1, N - 1, Is...> { };
template <int... Is> struct gen_seq<0, Is...> : seq<Is...> { };
}
constexpr size_t operator"" _len ( const char*, size_t len ){ return len; }
template < char... val > struct slit {};
#define EXPAND_STRING( type_name, str ) \
template <int... Is> slit< str[Is]...> make_##type_name( detail::seq<Is...> ); \
using type_name = decltype( make_##type_name( detail::gen_seq<str##_len>{} ) );
using Manual = slit< 'b', 'a', 'z'>;
EXPAND_STRING( MyFoo, "foo bar baz");
EXPAND_STRING( MyBar, "bla bli blo blu");
inline std::ostream& operator<<( std::ostream& os, slit<> ) { return os; }
template < char first, char... chars >
std::ostream& operator<<( std::ostream& os, slit<first,chars...> ) {
return os << first << " " << slit<chars...>{};
}
int main() {
std::cout << Manual{} << "\n";
std::cout << MyFoo{} << "\n";
std::cout << MyBar{} << "\n";
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKLy8gYysrMTQgaGFzIGl0IGh0dHA6Ly9lLi4uY29udGVudC1hdmFpbGFibGUtdG8tYXV0aG9yLW9ubHkuLi5lLmNvbS93L2NwcC91dGlsaXR5L2ludGVnZXJfc2VxdWVuY2UKbmFtZXNwYWNlIGRldGFpbCB7CiAgICB0ZW1wbGF0ZSA8aW50Li4uIElzPiBzdHJ1Y3Qgc2VxIHsgfTsKICAgIHRlbXBsYXRlIDxpbnQgTiwgaW50Li4uIElzPiBzdHJ1Y3QgZ2VuX3NlcSA6IGdlbl9zZXE8TiAtIDEsIE4gLSAxLCBJcy4uLj4geyAgfTsKICAgIHRlbXBsYXRlIDxpbnQuLi4gSXM+IHN0cnVjdCBnZW5fc2VxPDAsIElzLi4uPiA6IHNlcTxJcy4uLj4geyB9Owp9Cgpjb25zdGV4cHIgc2l6ZV90IG9wZXJhdG9yIiIgX2xlbiAoIGNvbnN0IGNoYXIqLCBzaXplX3QgbGVuICl7IHJldHVybiBsZW47IH0KCnRlbXBsYXRlIDwgY2hhci4uLiB2YWwgPiBzdHJ1Y3Qgc2xpdCB7fTsKCiNkZWZpbmUgRVhQQU5EX1NUUklORyggdHlwZV9uYW1lLCBzdHIgKSBcCnRlbXBsYXRlIDxpbnQuLi4gSXM+IHNsaXQ8IHN0cltJc10uLi4+IG1ha2VfIyN0eXBlX25hbWUoIGRldGFpbDo6c2VxPElzLi4uPiApOyBcCnVzaW5nIHR5cGVfbmFtZSA9IGRlY2x0eXBlKCBtYWtlXyMjdHlwZV9uYW1lKCBkZXRhaWw6Omdlbl9zZXE8c3RyIyNfbGVuPnt9ICkgKTsKCnVzaW5nIE1hbnVhbCA9IHNsaXQ8ICdiJywgJ2EnLCAneic+OyAKRVhQQU5EX1NUUklORyggTXlGb28sICJmb28gYmFyIGJheiIpOwpFWFBBTkRfU1RSSU5HKCBNeUJhciwgImJsYSBibGkgYmxvIGJsdSIpOwoKaW5saW5lIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PCggc3RkOjpvc3RyZWFtJiBvcywgc2xpdDw+ICkgeyByZXR1cm4gb3M7IH0KdGVtcGxhdGUgPCBjaGFyIGZpcnN0LCBjaGFyLi4uIGNoYXJzID4Kc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KCBzdGQ6Om9zdHJlYW0mIG9zLCBzbGl0PGZpcnN0LGNoYXJzLi4uPiApIHsKICAgIHJldHVybiBvcyA8PCBmaXJzdCA8PCAiICIgPDwgc2xpdDxjaGFycy4uLj57fTsKfQoKaW50IG1haW4oKSB7CiAgICBzdGQ6OmNvdXQgPDwgTWFudWFse30gPDwgIlxuIjsKICAgIHN0ZDo6Y291dCA8PCBNeUZvb3t9IDw8ICJcbiI7CiAgICBzdGQ6OmNvdXQgPDwgTXlCYXJ7fSA8PCAiXG4iOwp9