【发布时间】:2021-03-28 05:12:28
【问题描述】:
我正在尝试实现 Gauss-Legendre 求积,我想要一个模板函数 它将点数作为模板参数。 现在我有这个:
template<int number_of_quadrature_points>
double gaussian_quadrature_integral_core(double (*f)(double), double from, double to){
double scaling_factor = (to-from)/2;
double average_factor = (from+to)/2;
std::array<double, number_of_quadrature_points> factors;
std::array<double, number_of_quadrature_points> points;
if constexpr(number_of_quadrature_points == 2){
factors = {1, 1};
points = {-1.0/sqrt(3), 1.0/sqrt(3)};
}
if constexpr(number_of_quadrature_points == 3){
factors = {5.0/9.0, 8.0/9.0, 5.0/9.0};
points = {-sqrt(3.0/5.0), 0, sqrt(3.0/5.0)};
}
double sum = 0;
for(int i = 0; i < number_of_quadrature_points; i++){
sum += factors.at(i)*((*f)(scaling_factor*points.at(i)+average_factor));
}
sum *= scaling_factor;
return sum;
}
如你所见,当模板参数改变时,不仅数组大小改变,内容也改变,但对于给定大小,内容是众所周知的。出于这个原因,我认为如果 std::arrays 是 const static 会更好,因为该函数会被多次调用。
现在我只设法使用 if constexpr 来声明数组,但是我怎样才能使用它来定义和声明数组,以便它在 if constexpr 范围之外可见并且数组只定义一次?
【问题讨论】:
-
如果有人用不同于 2 或 3 的 N 调用你的函数会发生什么?
if constexpr很棒,但在这种情况下我会选择一个专门的模板(用于因素/点选择)。 -
@Cedric 这确实是个问题,现在我只想做一个静态断言,但我会重新考虑它,因为您的评论让我意识到这样的解决方案可能并不优雅。
标签: c++ arrays stl containers constexpr