这里有一段代码,应该会生成一个2048个元素的余弦查找表,代码来自于顾昌毅的《嵌入式系统构建》一书。
注意:本文适用于C++11。
我来自一个主要使用Java的世界,对C++的基础有一定了解。由于书中从未真正解释过,我对以下代码片段的实现方式以及下面这段话的实现方式(也是从书中取出的)非常困惑:
“模板特化和类继承将帮助我们摆脱constexpr函数仅能将返回状态作为其函数体的限制,这就是当表格大小增加时必须手动填充查找表的原因。”
如果有任何帮助,我将不胜感激。我理解constexpr模板部分将生成实际值,但我确实不知道struct正在做什么以及如何构建最终数组。
#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模板部分将生成实际值,但我确实不知道struct正在做什么以及如何构建最终数组。