C++ 具有c++;

C++ 具有c++;,c++,c++11,templates,lookup-tables,C++,C++11,Templates,Lookup Tables,下面是一个片段,可以生成2048个元素的余弦查找表,取自Gu Changyi的《构建嵌入式系统》一书: #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) {

下面是一个片段,可以生成2048个元素的余弦查找表,取自Gu Changyi的《构建嵌入式系统》一书:

#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;
#包括
#包括
模板
constexpr T查找表元素(int i){
返回{};
}
模板
constexpr uint16查找表元素(int i){
返回轮(cos(静态铸造(i)/2048*3.14159/4)*32767);
}
模板
结构查找表扩展{};
模板
结构查找\u表\u展开{
静态constexpr std::数组值={{look\u up\u table\u elem(0),N..};
};
模板
结构查找表扩展:查找表扩展{};
模板
constexpr std::数组查找\表\扩展::值;
const std::array lookup\u table=lookup\u table\u expand::value;
注意:是为C++11编写的

我来自一个主要的java世界,我对C++的基础知识有了很好的理解。由于这本书中从未真正解释过,我真的很困惑这段代码是如何完成任务的,以及它是如何实现以下目标的(也从书中删除):

模板专门化和类继承将帮助我们摆脱constexpr函数只能将返回状态作为其函数体的限制,这就是为什么在表大小增加时必须手动填充查找表的原因


任何帮助都将不胜感激。我理解了用COSTEXPR模板来生成实际值的部分,但是我真的不确定这个结构在做什么以及如何构建最终的数组。

首先让我们来看看下面的行:

const std::array<uint16_t, 2048> lookup_table =
        lookup_table_expand<uint16_t, 2048>::values;
lookup\u table\u expand
将匹配以下主模板:

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>
struct lookup_table_expand<T, 1, N...> {
    static constexpr std::array<T, sizeof...(N) + 1> values = {{
        look_up_table_elem<T>(0), N...
    }};
};
在这里,
lookup\u table\u expand
模板(
values
)的唯一成员将用模板参数列表的值初始化

请注意,
values
是一个
static constexpr
数据成员,它可以在
/
结构
声明中初始化,因此甚至不需要以下行:

template<typename T, int... N>
constexpr std::array<T, sizeof...(N) + 1> lookup_table_expand<T, 1, N...>::values;
模板
constexpr std::数组查找\表\扩展::值;
数组将由
查找\u table\u expand
继承,因此最终您可以从该结构访问它

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>
constexpr std::array<T, sizeof...(N) + 1> lookup_table_expand<T, 1, N...>::values;