gpt4 book ai didi

c++ - 在编译时以算法方式初始化 std::array

转载 作者:IT老高 更新时间:2023-10-28 12:34:13 24 4
gpt4 key购买 nike

考虑:

static constexpr unsigned num_points{ 7810 };
std::array< double, num_points > axis;

for (int i = 0; i < num_points; ++i)
{
axis[i] = 180 + 0.1 * i;
}

axis 是一个类范围的常量。我想避免像任何其他全局变量一样初始化它。可以在编译时完成吗?


这是最后一个类:

// https://www.nist.gov/pml/atomic-spectroscopy-compendium-basic-ideas-notation-data-and-formulas/atomic-spectroscopy
// https://www.nist.gov/pml/atomic-spectra-database
struct Spectrum
{
static constexpr unsigned _num_points{ 7810 };
using Axis = std::array< double, _num_points >;

static constexpr Axis _x{ [] () // wavelength, nm
{
Axis a {};
for( unsigned i = 0; i < _num_points; ++i )
{
a[ i ] = 180 + 0.1 * i;
}
return a;
} () };
Axis _y {}; // radiance, W·sr−1·m−2
};

代码和变量的混合是难看的,但至少公式就在读者的眼前。任何其他解决方案都需要大量输入才能获得类内定义的常量和类型。

或者如果我改变主意,我可以在运行时简单地返回 lambda。

最佳答案

为了完整起见,这里的版本不需要定义函数,而是使用 lambda。 C++17 引入了在常量表达式中使用 lambda 的能力,因此您可以声明数组 constexpr 并使用 lambda 对其进行初始化:

static constexpr auto axis = [] {
std::array<double, num_points> a{};
for (int i = 0; i < num_points; ++i) {
a[i] = 180 + 0.1 * i;
}
return a;
}();

(请注意最后一行中的 (),它会立即调用 lambda。)

如果您不喜欢 axis 声明中的 auto,因为它使读取实际类型变得更加困难,但您不想重复该类型在 lambda 中,您可以改为:

static constexpr std::array<double, num_points> axis = [] {
auto a = decltype(axis){};
for (int i = 0; i < num_points; ++i) {
a[i] = 180 + 0.1 * i;
}
return a;
}();

关于c++ - 在编译时以算法方式初始化 std::array,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56383454/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com