假设为了论证,我在类中有以下私有(private) 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 中使用像 std::pow 这样的表达式不是有效的 ISO C++(尽管arm-gcc 可能允许?),因为它可能返回域错误。我想要使用的实际表达式是一个涉及 std::exp 的有点复杂的函数。
请注意,我没有太多可用的 std 库,因为我正在为小型微处理器 Cortex M4 进行编译。
有没有更合适的方法来做到这一点,比如使用预处理器宏?我非常希望避免在开发过程中每次需要修改表时使用外部 Python 脚本之类的东西来计算表,然后将其粘贴进去。
最佳答案
正如您所说,问题在于 C 标准库函数通常没有标记为 constexpr
。
如果您需要使用 std::exp
,最好的解决方法是编写您自己的可以在编译时运行的实现。如果它是在编译时完成的,那么优化它可能是没有必要的,它只需要准确且适度高效即可。
有人问了如何做到这一点的问题here很久以前。您可以重用那里的想法并在 C++11 中重写为 constexpr
函数,尽管您必须重构它以避免 for 循环。在 C++14 中,需要较少的重构。
你也可以尝试严格通过模板来做,但是会更痛苦,而且 double
不能作为模板参数,所以会更复杂。
关于c++ - 从 constexpr 构造 const 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36117906/