将可变数量的参数函数转换为 C++ 中的简单内容

问题描述 投票:0回答:1

我需要做这样的事情:

我有一个大黑盒求解器

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++中实现这一点?

c++ variadic-functions
1个回答
0
投票

这能解决您的问题吗?

#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;
}
© www.soinside.com 2019 - 2024. All rights reserved.