c++ - 如何在 C++ 中使用单个模板参数传递两个 lambda 函数
问题描述
我正在编写一个程序,以数值方式计算 voigt 分布的值。但是,当我尝试使用单个类模板参数传递高斯和洛伦兹函数时遇到问题F
,即使它们属于同一类型。
当我使用两个模板参数时,比如F1
and F2
,它就像一个魅力。但是只要只有一个,g++就会抛出一个错误。立即将 lambdas 作为splot
's (convolution's) 参数传递并没有帮助。
#define _USE_MATH_DEFINES
#include <iostream>
#include <cmath>
#include <functional>
using namespace std;
#define MIN -10.
#define MAX 10.
#define EPS 0.01
template <typename T, class F> T trapezoid(F f, T a, T b, T eps) {
T result = T(0);
while (a <= b) {
result += f(a);
a += eps;
}
result -= (f(a) + f(b)) / T(2);
return result * eps;
}
template <class F>
double splot(F g, F l, double x, double sigma, double gamma) {
auto s = [g, l, x, sigma, gamma](double x_prime)->double {
return g(x_prime, sigma) * l(x - x_prime, gamma);
};
return trapezoid(s, MIN, MAX, EPS);
}
int main (void) {
double x = 0., sigma = 1.5, gamma = 0.1;
auto gauss = [](double x, double sigma)->double {
return exp(-1*x*x / (2*sigma*sigma)) / (sigma * sqrt(2*M_PI));
};
auto lorentz = [](double x, double gamma)->double {
return gamma / (M_PI*(x*x + gamma*gamma));
};
cout << "x: " << x << endl << "V(x): " <<
splot(gauss, lorentz, x, sigma, gamma) << endl;
return 0;
}
解决方案
我建议您使用std::function<>
如下所示的:
typedef std::function<double(double,double)> func;
func gauss = [](double x, double sigma)->double {
return exp(-1*x*x / (2*sigma*sigma)) / (sigma * sqrt(2*M_PI));
};
func lorentz = [](double x, double gamma)->double {
return gamma / (M_PI*(x*x + gamma*gamma));
};
cout << "x: " << x << endl << "V(x): " <<
splot(gauss, lorentz, x, sigma, gamma) << endl;`
正如@Christophe 指出的那样, lambda 将具有不同的类型,而另一方面,这可确保您为所有方法保持相同的类型。
推荐阅读
- powershell - 自动化 QUSER 并获得提示
- javascript - 删除逗号并重新添加时出现问题
- javascript - 图片没有上传到网站上
- c++ - GDB 显示调用堆栈上函数地址的当前编译二进制文件
- docker - What kind of data structure message in disk when RabbitMQ store with persistent mode?
- api - TikTok 登录套件:非法重定向链接
- postgresql - psql 硬盘使用情况
- python - discord.py 从 dm 中获取用户答案
- node.js - Nodejs窗口取消定义
- javascript - 我正在尝试在 sequelize 的帮助下将 mysql 数据库与 node.js 连接,但我显示访问被拒绝