#include <tuple>
#include <string>
#include <sstream>
#include <type_traits>
template<bool I>
using Bool = std::integral_constant<bool, I>;
template<typename T>
using EnableIf = typename std::enable_if<T::value>::type;
namespace detail {
template<size_t N = 0, class Elem, class Traits, typename... Args, EnableIf<Bool<(N >= sizeof...(Args))>>...>
inline void helper(std::basic_ostream<Elem,Traits>& out, const size_t i, const std::tuple<Args...>& tup) {}
template<size_t N = 0, class Elem, class Traits, typename... Args, EnableIf<Bool<(N < sizeof...(Args))>>...>
inline void helper(std::basic_ostream<Elem,Traits>& out, const size_t i, const std::tuple<Args...>& tup) {
if(i == N) {
out << std::get<N>(tup);
}
else {
helper<N+1, Elem, Traits, Args...>(out, i, tup);
}
}
} // detail
// {{{{{0},1 prints {{1
template<size_t N = 0, typename... Args>
std::string format(const std::string& str, Args&&... args) {
if(sizeof...(args) < 1)
return str;
auto tup = std::make_tuple(std::forward<Args>(args)...);
auto first = std::begin(str);
auto last = std::end(str);
size_t index = 0;
std::ostringstream out;
while(first != last) {
if(*first != '{') {
out << *first++;
continue;
}
else { // If it's a { character
auto check = first;
if(++check == last || *check == '}') {
// Special cases.
out << *first++;
continue;
}
index = 0;
// Keep incrementing the index.
while(check != last && (*check >= '0' && *check <= '9')) {
index *= 10;
index += ((*check) - '0');
++check;
}
if(*check == '}') {
detail::helper(out, index, tup);
++check;
}
else {
out << *check;
}
first = check;
}
}
std::string result = out.str();
return result;
}
#include <iostream>
int main() {
std::cout << format("{{{{{0}",1) << '\n' << format("{{{{{0}{{",1) << '\n' << format("{{{{{0}{{}{}",1) << '\n';
auto a = format("{0},{1},{2},{3},{4},{5},{6},{7},{8},{9},{10},{11}", 1,2,3,4,5,6,7,8,9,10,11,12);
auto b = format("{0} + {0} = {1}", 2, 4);
std::cout << format(4 > 5 ? "({0})" : "[{0}]", 10) << '\n' << a << '\n' << b;
}
I2luY2x1ZGUgPHR1cGxlPgojaW5jbHVkZSA8c3RyaW5nPgojaW5jbHVkZSA8c3N0cmVhbT4KI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgoKdGVtcGxhdGU8Ym9vbCBJPgp1c2luZyBCb29sID0gc3RkOjppbnRlZ3JhbF9jb25zdGFudDxib29sLCBJPjsKCnRlbXBsYXRlPHR5cGVuYW1lIFQ+CnVzaW5nIEVuYWJsZUlmID0gdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8VDo6dmFsdWU+Ojp0eXBlOwoKbmFtZXNwYWNlIGRldGFpbCB7CnRlbXBsYXRlPHNpemVfdCBOID0gMCwgY2xhc3MgRWxlbSwgY2xhc3MgVHJhaXRzLCB0eXBlbmFtZS4uLiBBcmdzLCBFbmFibGVJZjxCb29sPChOID49IHNpemVvZi4uLihBcmdzKSk+Pi4uLj4KaW5saW5lIHZvaWQgaGVscGVyKHN0ZDo6YmFzaWNfb3N0cmVhbTxFbGVtLFRyYWl0cz4mIG91dCwgY29uc3Qgc2l6ZV90IGksIGNvbnN0IHN0ZDo6dHVwbGU8QXJncy4uLj4mIHR1cCkge30KdGVtcGxhdGU8c2l6ZV90IE4gPSAwLCBjbGFzcyBFbGVtLCBjbGFzcyBUcmFpdHMsIHR5cGVuYW1lLi4uIEFyZ3MsIEVuYWJsZUlmPEJvb2w8KE4gPCBzaXplb2YuLi4oQXJncykpPj4uLi4+CmlubGluZSB2b2lkIGhlbHBlcihzdGQ6OmJhc2ljX29zdHJlYW08RWxlbSxUcmFpdHM+JiBvdXQsIGNvbnN0IHNpemVfdCBpLCBjb25zdCBzdGQ6OnR1cGxlPEFyZ3MuLi4+JiB0dXApIHsKICAgIGlmKGkgPT0gTikgewogICAgICAgIG91dCA8PCBzdGQ6OmdldDxOPih0dXApOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgaGVscGVyPE4rMSwgRWxlbSwgVHJhaXRzLCBBcmdzLi4uPihvdXQsIGksIHR1cCk7CiAgICB9Cn0KfSAvLyBkZXRhaWwKCgovLyB7e3t7ezB9LDEgcHJpbnRzIHt7MQoKdGVtcGxhdGU8c2l6ZV90IE4gPSAwLCB0eXBlbmFtZS4uLiBBcmdzPgpzdGQ6OnN0cmluZyBmb3JtYXQoY29uc3Qgc3RkOjpzdHJpbmcmIHN0ciwgQXJncyYmLi4uIGFyZ3MpIHsKICAgIGlmKHNpemVvZi4uLihhcmdzKSA8IDEpCiAgICAgICAgcmV0dXJuIHN0cjsKICAgIGF1dG8gdHVwID0gc3RkOjptYWtlX3R1cGxlKHN0ZDo6Zm9yd2FyZDxBcmdzPihhcmdzKS4uLik7CiAgICBhdXRvIGZpcnN0ID0gc3RkOjpiZWdpbihzdHIpOwogICAgYXV0byBsYXN0ID0gc3RkOjplbmQoc3RyKTsKICAgIHNpemVfdCBpbmRleCA9IDA7CiAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3V0OwogICAgd2hpbGUoZmlyc3QgIT0gbGFzdCkgewogICAgICAgIGlmKCpmaXJzdCAhPSAneycpIHsKICAgICAgICAgICAgb3V0IDw8ICpmaXJzdCsrOwogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7IC8vIElmIGl0J3MgYSB7IGNoYXJhY3RlcgogICAgICAgICAgICBhdXRvIGNoZWNrID0gZmlyc3Q7CiAgICAgICAgICAgIGlmKCsrY2hlY2sgPT0gbGFzdCB8fCAqY2hlY2sgPT0gJ30nKSB7CiAgICAgICAgICAgICAgICAvLyBTcGVjaWFsIGNhc2VzLgogICAgICAgICAgICAgICAgb3V0IDw8ICpmaXJzdCsrOwogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaW5kZXggPSAwOwogICAgICAgICAgICAvLyBLZWVwIGluY3JlbWVudGluZyB0aGUgaW5kZXguCiAgICAgICAgICAgIHdoaWxlKGNoZWNrICE9IGxhc3QgJiYgKCpjaGVjayA+PSAnMCcgJiYgKmNoZWNrIDw9ICc5JykpIHsKICAgICAgICAgICAgICAgIGluZGV4ICo9IDEwOwogICAgICAgICAgICAgICAgaW5kZXggKz0gKCgqY2hlY2spIC0gJzAnKTsKICAgICAgICAgICAgICAgICsrY2hlY2s7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYoKmNoZWNrID09ICd9JykgewogICAgICAgICAgICAgICAgZGV0YWlsOjpoZWxwZXIob3V0LCBpbmRleCwgdHVwKTsKICAgICAgICAgICAgICAgICsrY2hlY2s7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBvdXQgPDwgKmNoZWNrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZpcnN0ID0gY2hlY2s7CiAgICAgICAgfQogICAgfQogICAgc3RkOjpzdHJpbmcgcmVzdWx0ID0gb3V0LnN0cigpOwogICAgcmV0dXJuIHJlc3VsdDsKfQoKI2luY2x1ZGUgPGlvc3RyZWFtPgoKaW50IG1haW4oKSB7CiAgICBzdGQ6OmNvdXQgPDwgZm9ybWF0KCJ7e3t7ezB9IiwxKSA8PCAnXG4nIDw8IGZvcm1hdCgie3t7e3swfXt7IiwxKSA8PCAnXG4nIDw8IGZvcm1hdCgie3t7e3swfXt7fXt9IiwxKSA8PCAnXG4nOwogICAgYXV0byBhID0gZm9ybWF0KCJ7MH0sezF9LHsyfSx7M30sezR9LHs1fSx7Nn0sezd9LHs4fSx7OX0sezEwfSx7MTF9IiwgMSwyLDMsNCw1LDYsNyw4LDksMTAsMTEsMTIpOwogICAgYXV0byBiID0gZm9ybWF0KCJ7MH0gKyB7MH0gPSB7MX0iLCAyLCA0KTsKICAgIHN0ZDo6Y291dCA8PCBmb3JtYXQoNCA+IDUgPyAiKHswfSkiIDogIlt7MH1dIiwgMTApIDw8ICdcbicgPDwgYSA8PCAnXG4nIDw8IGI7Cn0K