Oto fragment, który powinien generować tabelę cosinus przeglądową 2048 elementów, pochodzi z książki budowania systemów wbudowanych przez Changyi Gu:Cosinus lookup stół z C++
#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;
Uwaga: Napisane dla C++ 11.
Pochodzę ze świata głównie w Javie i mam dobre zrozumienie podstaw języka C++. Ponieważ nigdy naprawdę wyjaśnione w książce, jestem naprawdę mylić, jak to urywek osiągnąć zadanie, i jak to osiągnąć następujące (także wyjęte z książki):
specjalizację szablonu i klasy dziedziczenie pomoże nam pozbyć się restrykcji, że funkcja constexpr może mieć tylko stan powrotu jako jej ciało funkcyjne, dlatego tablica przeglądowa musi zostać wypełniona ręcznie, gdy zwiększa się rozmiar tabeli.
Każda pomoc zostanie bardzo doceniona. Rozumiem część z szablonem constexpr, która wygenerowałaby rzeczywistą wartość, ale nie jestem naprawdę pewien, co robi struktura i jak budowana jest ostateczna tablica.
Bardzo dobre wyjaśnienie, sprawia, że rzeczy stają się bardziej przejrzyste! – Nirri