C++ 用constexpr构造const数组

C++ 用constexpr构造const数组,c++,c++11,arm,constexpr,lookup-tables,C++,C++11,Arm,Constexpr,Lookup Tables,为了论证,假设我在一个类中有以下私有constexpr: static constexpr uint16_t square_it(uint16_t x) { return std::pow(x, 2); } 然后,我想使用上面的constexpr为同一类的同一部分中最多255个整数构造这些值的静态常量数组: static const uint16_t array_of_squares[256] = { //something }; 我希望数组在编译时构造,如果可能的话,不要在

为了论证,假设我在一个类中有以下私有constexpr:

static constexpr uint16_t square_it(uint16_t x)
{
    return std::pow(x, 2);
}
然后,我想使用上面的constexpr为同一类的同一部分中最多255个整数构造这些值的静态常量数组:

static const uint16_t array_of_squares[256] =
{
    //something
};
我希望数组在编译时构造,如果可能的话,不要在运行时构造。我认为第一个问题是使用STD中的STD::POW的表达式不是有效的ISO C++(尽管ARM GCC可能允许),因为它可以返回域错误。我想要使用的实际表达式是一个有点复杂的函数,涉及std::exp

注意,我没有太多的std库,因为我正在编译一个小型微处理器CortexM4


有没有更合适的方法来实现这一点,比如说使用预处理器宏?我非常希望避免在开发过程中每次需要修改表时都使用外部Python脚本之类的东西来计算表,然后将其粘贴进去。

正如您所说,问题是C标准库函数通常没有标记
constepr

如果您需要使用
std::exp
,这里最好的解决方法是编写您自己的可在编译时运行的实现。如果它是在编译时完成的,那么优化它可能是没有必要的,它只需要准确和适度有效

很久以前有人问过一个关于如何做到这一点的问题。您可以重用那里的想法,并在C++11中重写为
constepr
函数,尽管您必须重构它以避免for循环。在C++14中,需要的重构更少


您也可以尝试严格通过模板进行操作,但这样做会更痛苦,而且
double
不能作为模板参数,因此会更复杂。

类似的方法如何

constexpr uint16_t square_it(uint16_t v) { return v*v; }

template <size_t N, class = std::make_index_sequence<N>>
struct gen_table;

template <size_t N, size_t... Is>
struct gen_table<N, std::index_sequence<Is...>> {
    static const uint16_t values[N] = {square_it(Is)...};
};

constexpr auto&& array_of_squares = gen_table<256>::values;
constexpr uint16\u t square\u it(uint16\u t v){return v*v;}
模板
结构genu表;
模板
结构gen_表{
静态常数16_t值[N]={平方_it(Is)…..};
};
constexpr auto&&array_of_squares=gen_table::values;

我不知道那个微处理器是否支持这种操作。它可能没有标准库中的
make_index_sequence
(尽管您可以找到这样的实现),而且模板实例化可能会占用太多内存。但至少它在某个地方起作用

有一个外部Python脚本计算表,并写出一个C++文件,它可以直接用于构建;无需复制/粘贴。