Создание таблицы поиска во время компиляции - PullRequest
3 голосов
/ 19 мая 2019

C ++ нуб здесь.Какой самый простой способ создать массив {f(0), f(1), ..., f(1023)} во время компиляции, учитывая constexpr f?

Ответы [ 2 ]

5 голосов
/ 19 мая 2019

Вы можете использовать немедленную лямбду:

#include <array>

using ResultT = int;
constexpr ResultT f(int i)
{
    return i * 2;
}

constexpr auto LUT = []
{
    constexpr auto LUT_Size = 1024;
    std::array<ResultT, LUT_Size> arr = {};

    for (int i = 0; i < LUT_Size; ++i)
    {
        arr[i] = f(i);
    }

    return arr;
}();

static_assert(LUT[100] == 200);
4 голосов
/ 19 мая 2019

Для решения 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 более удобно.

...