#include <array>
#include <iostream>
#include <functional>
#if 1 // Not in C++11 // make_index_sequence
#include <cstdint>
template <std::size_t...> struct index_sequence {};
template <std::size_t N, std::size_t... Is>
struct make_index_sequence : make_index_sequence<N - 1, N - 1, Is...> {};
template <std::size_t... Is>
struct make_index_sequence<0u, Is...> : index_sequence<Is...> {};
#endif // make_index_sequence
template <std::int16_t value>
struct x
{
static void f() { std::cout << value << std::endl; };
};
template <std::int16_t lowest, std::size_t ... Is>
constexpr std::array<void (*)(), sizeof...(Is)>
make_x_functions(index_sequence<Is...>)
{
return {&x<std::int16_t(lowest + Is)>::f...};
}
void call_x(std::int16_t i)
{
constexpr std::int16_t lowest = -42;
constexpr std::int16_t size = 100;
constexpr auto arr = make_x_functions<lowest>(make_index_sequence<size>());
if (lowest <= i && i < lowest + size)
{
arr[i - lowest]();
}
}
int main() {
call_x(0);
call_x(42);
}
I2luY2x1ZGUgPGFycmF5PgojaW5jbHVkZSA8aW9zdHJlYW0+CiNpbmNsdWRlIDxmdW5jdGlvbmFsPgoKI2lmIDEgLy8gTm90IGluIEMrKzExIC8vIG1ha2VfaW5kZXhfc2VxdWVuY2UKI2luY2x1ZGUgPGNzdGRpbnQ+Cgp0ZW1wbGF0ZSA8c3RkOjpzaXplX3QuLi4+IHN0cnVjdCBpbmRleF9zZXF1ZW5jZSB7fTsKCnRlbXBsYXRlIDxzdGQ6OnNpemVfdCBOLCBzdGQ6OnNpemVfdC4uLiBJcz4Kc3RydWN0IG1ha2VfaW5kZXhfc2VxdWVuY2UgOiBtYWtlX2luZGV4X3NlcXVlbmNlPE4gLSAxLCBOIC0gMSwgSXMuLi4+IHt9OwoKdGVtcGxhdGUgPHN0ZDo6c2l6ZV90Li4uIElzPgpzdHJ1Y3QgbWFrZV9pbmRleF9zZXF1ZW5jZTwwdSwgSXMuLi4+IDogaW5kZXhfc2VxdWVuY2U8SXMuLi4+IHt9OwoKI2VuZGlmIC8vIG1ha2VfaW5kZXhfc2VxdWVuY2UKCnRlbXBsYXRlIDxzdGQ6OmludDE2X3QgdmFsdWU+CnN0cnVjdCB4CnsKICAgIHN0YXRpYyB2b2lkIGYoKSB7IHN0ZDo6Y291dCA8PCB2YWx1ZSA8PCBzdGQ6OmVuZGw7IH07Cn07CgoKdGVtcGxhdGUgPHN0ZDo6aW50MTZfdCBsb3dlc3QsIHN0ZDo6c2l6ZV90IC4uLiBJcz4KY29uc3RleHByIHN0ZDo6YXJyYXk8dm9pZCAoKikoKSwgc2l6ZW9mLi4uKElzKT4KbWFrZV94X2Z1bmN0aW9ucyhpbmRleF9zZXF1ZW5jZTxJcy4uLj4pCnsKICAgIHJldHVybiB7Jng8c3RkOjppbnQxNl90KGxvd2VzdCArIElzKT46OmYuLi59Owp9Cgp2b2lkIGNhbGxfeChzdGQ6OmludDE2X3QgaSkKewogICAgY29uc3RleHByIHN0ZDo6aW50MTZfdCBsb3dlc3QgPSAtNDI7CiAgICBjb25zdGV4cHIgc3RkOjppbnQxNl90IHNpemUgPSAxMDA7CiAgICBjb25zdGV4cHIgYXV0byBhcnIgPSBtYWtlX3hfZnVuY3Rpb25zPGxvd2VzdD4obWFrZV9pbmRleF9zZXF1ZW5jZTxzaXplPigpKTsKCiAgICBpZiAobG93ZXN0IDw9IGkgJiYgaSA8IGxvd2VzdCArIHNpemUpCiAgICB7CiAgICAgICAgYXJyW2kgLSBsb3dlc3RdKCk7CiAgICB9Cn0KCmludCBtYWluKCkgewoKICAgIGNhbGxfeCgwKTsKICAgIGNhbGxfeCg0Mik7Cgp9Cg==