我需要做这样的事情:
我有一个大黑盒求解器
solver(f, ...)
,它接受一个函数(例如)作为输入:
double f(x, a, b, c) {
return 0.0
}
a, b, c
发生变化,求解器可以检测到这一点。
使用起来确实不是很简单,因为如果我有 100 个参数,我必须编写如下内容:
double f(x, a_0, a_1, ..., a_99) {
return 0.0;
}
我想做的是编写一个用户友好的可变参数函数,例如
// Variadic function (general form)
template <typename... Args>
double f(double x, Args... args) {
const double z = (x - std::get<1>(std::make_tuple(args...))) / std::get<2>(std::make_tuple(args...));
return std::get<0>(std::make_tuple(args...)) * std::exp(-0.5 * z * z);
}
可以将其转换为传递给求解器:
double gaussian(double x, double a, double b, double c) {
const double z = (x - b) / c;
return a * std::exp(-0.5 * z * z);
}
如何在C++中实现这一点?
这能解决您的问题吗?
#include <concepts>
#include <cmath>
#include <utility>
#include <tuple>
double funct(std::floating_point auto... ts){
const auto tuple = std::make_tuple(std::forward<decltype(ts)>(ts)...);
const double z = (std::get<0>(tuple) - std::get<2>(tuple)) / std::get<3>(tuple);
return std::get<1>(tuple) * std::exp(-0.5 * z * z);
}
int main()
{
funct(0.0, 0.0, 0.0, 0.0);
return 0;
}