Вот фрагмент, который должен генерировать таблицу косинусного поиска из 2048 элементов, взятую из книги "Встроенные системы" Changyi Gu:
#include <cmath>
#include <array>
template<typename T>
constexpr T look_up_table_elem (int i) {
return {};
}
template<>
constexpr uint16_t look_up_table_elem (int i) {
return round (cos (static_cast <long double>(i) / 2048 * 3.14159 / 4) * 32767);
}
template<typename T, int... N>
struct lookup_table_expand{};
template<typename T, int... N>
struct lookup_table_expand<T, 1, N...> {
static constexpr std::array<T, sizeof...(N) + 1> values = {{ look_up_table_elem<T>(0), N... }};
};
template<typename T, int L, int... N>
struct lookup_table_expand<T, L, N...>: lookup_table_expand<T, L-1, look_up_table_elem<T>(L-1), N...> {};
template<typename T, int... N>
constexpr std::array<T, sizeof...(N) + 1> lookup_table_expand<T, 1, N...>::values;
const std::array<uint16_t, 2048> lookup_table = lookup_table_expand<uint16_t, 2048>::values;
Примечание: написано для С++ 11.
Я родом из прежде всего Java-мира, и я хорошо понимаю основы С++. Поскольку в книге она действительно не объяснялась, я действительно смущен тем, как этот сниппет справляется с задачей, и как она достигает следующего (также взятого из книги):
Специализация шаблона и наследование классов помогут нам избавиться от ограничения, что функция constexpr может иметь только состояние возврата в качестве своего тела функции, поэтому таблица поиска должна быть заполнена вручную при увеличении размера таблицы.
Любая помощь будет принята с благодарностью. Я понимаю часть с шаблоном constexpr, которая будет генерировать фактическое значение, но я действительно не уверен, что делает структура и как создается последний массив.