Для решения DeviationN требуется C ++ 17 (для constexpr lambda).
В качестве дополнения приведено решение, работающее с C ++ 14
#include <array>
constexpr int f(int i) { return 2 * i; }
template <std::size_t... I>
constexpr auto lookup_helper(std::index_sequence<I...>)
{
return std::array<int, sizeof...(I)>({f(I)...});
}
template <size_t N>
constexpr auto lookup()
{
return lookup_helper(std::make_index_sequence<N>());
}
int main()
{
constexpr int N = 10;
constexpr auto a = lookup<N>();
// Check it works
static_assert(a[N-1]==2*(N-1));
}
Идея состоит в том, чтобы использовать std::index_sequence<I...>
. Однако, если вы можете использовать C ++ 17, решение DeviationN более удобно.