gpt4 book ai didi

c++ - 模板类的静态成员数组的延迟初始化

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:55:30 27 4
gpt4 key购买 nike

我正在编写代码来执行 Gaussian integrationn点,其中 n是一个编译时间常数。

对于给定的 n ,我知道如何计算横坐标和权重。计算必须从头开始为每个不同的 n 进行。 .

现在,我按照这些思路做一些事情:

// Several structs like this one (laguerre, chebyshev, etc).
template <size_t n>
struct legendre
{
static const size_t size = n;
static const double x[n];
static const double w[n];
};

template <typename Rule, typename F>
double gauss_quadrature (F&& f)
{
double acc = 0;
for (size_t j = 0; j < Rule::size; j++)
acc += Rule::w[j] * f (Rule::x[j]);

return acc;
}

像这样使用:

double i = gauss_quadrature<legendre<12>> (f);

现在,我可以专注于翻译单元 legendre<12> 的系数, 通过做

template <>
const legendre<12>::x[12] = { ... };

template <>
const legendre<12>::w[12] = { ... };

一切都很好,只要我只使用 12 点高斯-勒让德。

现在,我正在尝试不同数量的点,并且我知道如何生成权重和节点。例如,我可以提供一个例程

void compute_legendre_coeffs (size_t n, double* w, double* x);

和:

  • 当我调用 gauss_quadrature<legendre<n>> , 模板 legendre<n>自动实例化(就是这种情况)。
  • legendre<n>为某些编译时实例化 n , 我想要上面的 compute_legendre_coeffs在 main 之前的某个时间被调用,以便它填充 xw成员数组。我该如何实现?

我知道必须先定义数组:

template <size_t n>
const double legendre<n>::x[n] = {};

template <size_t n>
const double legendre<n>::w[n] = {};

但我想不出一个方法来初始化它们。任何人都有这样做的技巧吗?

最佳答案

将数组转换为std::array:

#include <array>
template<int n> struct legendre {
static const std::array<double, n> x;
};
void compute_xs(int n, double *xs) {
...
}
template<int n> std::array<double, n> make_xs() {
std::array<double, n> xs;
compute_xs(n, xs.data());
return xs;
}
template<int n> const std::array<double, n> legendre<n>::x = make_xs<n>();

这确实意味着分别计算 xw 系数,但如果效率较低,也有变通方法,例如:

template<int n> struct legendre_coeffs {
std::array<double, n> x, w;
legendre_coeffs(): x(), w() { compute_legendre_coeffs(n, w.data(), x.data()); }
};
template<int n> struct legendre {
static const legendre_coeffs coeffs;
static const double (&x)[n], (&w)[n];
};
template<int n> const legendre_coeffs legendre<n>::coeffs;
template<int n> const double (&legendre<n>::x)[n]
= *reinterpret_cast<const double (*)[n]>(legendre<n>::coeffs::x.data());
template<int n> const double (&legendre<n>::w)[n]
= *reinterpret_cast<const double (*)[n]>(legendre<n>::coeffs::w.data());

关于c++ - 模板类的静态成员数组的延迟初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13705673/

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