#include <iostream>
template<std::uintmax_t, char...>
struct strtoi_impl;
template<std::uintmax_t Rest, char Last>
struct strtoi_impl<Rest, Last> {
static constexpr std::uintmax_t value = Rest + (Last - '0');
};
template<std::uintmax_t Rest, char Head, char... Tail>
struct strtoi_impl<Rest, Head, Tail...> {
static constexpr std::uintmax_t value =
strtoi_impl<(Rest + (Head - '0')) * 10, Tail...>::value;
};
template<char... Number>
struct strtoi {
static constexpr std::uintmax_t value =
strtoi_impl<0, Number...>::value;
};
int main()
{
static_assert(strtoi<'1', '2', '3'>::value == 123, "no.");
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKdGVtcGxhdGU8c3RkOjp1aW50bWF4X3QsIGNoYXIuLi4+CnN0cnVjdCBzdHJ0b2lfaW1wbDsKCnRlbXBsYXRlPHN0ZDo6dWludG1heF90IFJlc3QsIGNoYXIgTGFzdD4Kc3RydWN0IHN0cnRvaV9pbXBsPFJlc3QsIExhc3Q+IHsKICAgIHN0YXRpYyBjb25zdGV4cHIgc3RkOjp1aW50bWF4X3QgdmFsdWUgPSBSZXN0ICsgKExhc3QgLSAnMCcpOwp9OwoKdGVtcGxhdGU8c3RkOjp1aW50bWF4X3QgUmVzdCwgY2hhciBIZWFkLCBjaGFyLi4uIFRhaWw+CnN0cnVjdCBzdHJ0b2lfaW1wbDxSZXN0LCBIZWFkLCBUYWlsLi4uPiB7CiAgICBzdGF0aWMgY29uc3RleHByIHN0ZDo6dWludG1heF90IHZhbHVlID0gCiAgICAgICAgc3RydG9pX2ltcGw8KFJlc3QgKyAoSGVhZCAtICcwJykpICogMTAsIFRhaWwuLi4+Ojp2YWx1ZTsKfTsKCnRlbXBsYXRlPGNoYXIuLi4gTnVtYmVyPgpzdHJ1Y3Qgc3RydG9pIHsKICAgIHN0YXRpYyBjb25zdGV4cHIgc3RkOjp1aW50bWF4X3QgdmFsdWUgPSAKICAgICAgICBzdHJ0b2lfaW1wbDwwLCBOdW1iZXIuLi4+Ojp2YWx1ZTsKfTsKCmludCBtYWluKCkgCnsKICAgIHN0YXRpY19hc3NlcnQoc3RydG9pPCcxJywgJzInLCAnMyc+Ojp2YWx1ZSA9PSAxMjMsICJuby4iKTsKCXJldHVybiAwOwp9Cg==