template<unsigned int...>
struct IndexList{
};
template<class IndexList, unsigned int LAST> struct Append;
template<unsigned int... FIRST, unsigned int LAST>
struct Append<IndexList<FIRST...>, LAST> {
typedef IndexList<FIRST..., LAST> Result;
};
template<unsigned int N>
struct Indices {
typedef typename Append<typename Indices<N - 1U>::Result, N - 1U>::Result Result;
};
template<>
struct Indices<0U> {
typedef IndexList<> Result;
};
template<unsigned int N>
struct PowerOfTen {
static_assert(N < 20U, "Too large");
static const unsigned long long value = 10ULL * PowerOfTen<N - 1>::value;
};
template<>
struct PowerOfTen<0U> {
static const unsigned long long value = 1ULL;
};
template<class IndexList> struct Values;
template<unsigned int... N>
struct Values<IndexList<N...>> {
static const unsigned long long values[sizeof...(N)];
};
template<unsigned int... N>
const unsigned long long Values<IndexList<N...>>::values[sizeof...(N)] = {
PowerOfTen<N>::value...
};
template<unsigned int N>
using PowerOfTenTable = Values<typename Indices<N>::Result>;
#include <iostream>
int main() {
for (unsigned int i = 0; i < 10U; ++i) {
std::cout << PowerOfTenTable<10U>::values[i] << std::endl;
}
return 0;
}
dGVtcGxhdGU8dW5zaWduZWQgaW50Li4uPgpzdHJ1Y3QgSW5kZXhMaXN0ewp9OwoKdGVtcGxhdGU8Y2xhc3MgSW5kZXhMaXN0LCB1bnNpZ25lZCBpbnQgTEFTVD4gc3RydWN0IEFwcGVuZDsKCnRlbXBsYXRlPHVuc2lnbmVkIGludC4uLiBGSVJTVCwgdW5zaWduZWQgaW50IExBU1Q+CnN0cnVjdCBBcHBlbmQ8SW5kZXhMaXN0PEZJUlNULi4uPiwgTEFTVD4gewogIHR5cGVkZWYgSW5kZXhMaXN0PEZJUlNULi4uLCBMQVNUPiBSZXN1bHQ7Cn07Cgp0ZW1wbGF0ZTx1bnNpZ25lZCBpbnQgTj4Kc3RydWN0IEluZGljZXMgewogIHR5cGVkZWYgdHlwZW5hbWUgQXBwZW5kPHR5cGVuYW1lIEluZGljZXM8TiAtIDFVPjo6UmVzdWx0LCBOIC0gMVU+OjpSZXN1bHQgUmVzdWx0Owp9OwoKdGVtcGxhdGU8PgpzdHJ1Y3QgSW5kaWNlczwwVT4gewogIHR5cGVkZWYgSW5kZXhMaXN0PD4gUmVzdWx0Owp9OwoKdGVtcGxhdGU8dW5zaWduZWQgaW50IE4+CnN0cnVjdCBQb3dlck9mVGVuIHsKICBzdGF0aWNfYXNzZXJ0KE4gPCAyMFUsICJUb28gbGFyZ2UiKTsKICBzdGF0aWMgY29uc3QgdW5zaWduZWQgbG9uZyBsb25nIHZhbHVlID0gMTBVTEwgKiBQb3dlck9mVGVuPE4gLSAxPjo6dmFsdWU7Cn07Cgp0ZW1wbGF0ZTw+CnN0cnVjdCBQb3dlck9mVGVuPDBVPiB7CiAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyB2YWx1ZSA9IDFVTEw7Cn07Cgp0ZW1wbGF0ZTxjbGFzcyBJbmRleExpc3Q+IHN0cnVjdCBWYWx1ZXM7Cgp0ZW1wbGF0ZTx1bnNpZ25lZCBpbnQuLi4gTj4Kc3RydWN0IFZhbHVlczxJbmRleExpc3Q8Ti4uLj4+IHsKICBzdGF0aWMgY29uc3QgdW5zaWduZWQgbG9uZyBsb25nIHZhbHVlc1tzaXplb2YuLi4oTildOwp9OwoKdGVtcGxhdGU8dW5zaWduZWQgaW50Li4uIE4+CmNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyBWYWx1ZXM8SW5kZXhMaXN0PE4uLi4+Pjo6dmFsdWVzW3NpemVvZi4uLihOKV0gPSB7CiAgUG93ZXJPZlRlbjxOPjo6dmFsdWUuLi4KfTsKCnRlbXBsYXRlPHVuc2lnbmVkIGludCBOPgp1c2luZyBQb3dlck9mVGVuVGFibGUgPSBWYWx1ZXM8dHlwZW5hbWUgSW5kaWNlczxOPjo6UmVzdWx0PjsKCiNpbmNsdWRlIDxpb3N0cmVhbT4KCmludCBtYWluKCkgewogIGZvciAodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgMTBVOyArK2kpIHsKICAgIHN0ZDo6Y291dCA8PCBQb3dlck9mVGVuVGFibGU8MTBVPjo6dmFsdWVzW2ldIDw8IHN0ZDo6ZW5kbDsKICB9CiAgcmV0dXJuIDA7Cn0=