表下面是应该产生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