表下面是應該產生2048元的餘弦查找表,由昌邑顧從圖書大廈嵌入式系統採取的一個片段:餘弦查找與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;
注:寫於C++ 11。
我來自一個主要的Java世界,我對C++的基本知識有了一個很好的把握。因爲它從來沒有真正在書中解釋說,我是爲這如何片斷實現任務真的很困惑,以及它是如何實現以下(也考慮出書):
模板專業化和類繼承將幫助我們擺脫constexpr函數只能將返回狀態作爲其函數體的限制,這就是爲什麼當表大小增加時必須手動填充查找表的原因。
任何幫助將不勝感激。我理解帶有constexpr模板的部分會產生實際值,但我真的不確定結構在做什麼以及最終數組是如何構建的。
很好的解釋,讓事情變得更清晰! – Nirri