函数指针和任意参数

fT3g0

想象一下,我想编写一个函数来对两个函数的值做一些事情(例如比较)。

f1和f2是示例,但它应适用于更多函数,而与参数的数量和类型无关。

double f1 (double x, double y, double z) {
    return pow(x,3)+2*pow(y,2)+3*z;
}

double f2 (std::vector<double> vec) {
    double result;
    for (int i=0; i<vec.size(); i++){
        result += vec[i];
    }
    return result;
}

现在,我需要一个可以像这样(或类似方式)调用的比较函数:

int main() {
    std::vector<double> example_vector {1,3,3,7};
    compare(f1, {4, 5, 6}, f2, example_vector);
    return 0
}

在内部比较中,它将调用x = 4,y = 5,z = 6的f1和vec = example_vector的f2。

编辑:

这是我最后使用的解决方案:

#include <iostream>
#include <tuple>
#include <utility>
#include <math.h>
#include <vector>

template<typename FuncA, typename FuncB, typename ...FA_Params, typename ...FB_Params>
void do_sth(FuncA &func_a, FuncB &func_b, const std::tuple<FA_Params ...> &a_params, const std::tuple<FB_Params ...> &b_params) {
    std::cout << std::apply(func_a, a_params) << std::endl;
    std::cout << std::apply(func_b, b_params) << std::endl;
}

//f1, f2 and f3 are example functions

double f1 (double x, double y, double z) {
    return pow(x,3)+2*pow(y,2)+3*z;
}

double f2 (std::vector<double> vec) {
    double result;
    for (int i=0; i<vec.size(); i++){
        result += vec[i];
    }
    return result;
}

double f3 (double a, double omega, double t, double delta) {
    double result;
    result = a*sin(omega*t+delta);
}

int main() {
    do_sth(f1, f2, std::make_tuple(1.0, 2.3, 1.3), std::make_tuple(std::vector<double>{1.0, 2, 3}));
    return 0;
}

C ++ 20不适用于我,这只需要C ++ 17。

do_sth应该能够执行任何功能

科拉尔克

我在这里看不到目标,因此很难使其成为通用解决方案,但基本上您可以执行以下操作:

template<typename FuncA, typename FuncB>
void compare(FuncA func_a, const std::vector<double> &vec_a, FuncB func_b, const std::vector<double> &vec_b) {
    double res1 = func_a(vec_a[0], vec_a[1], vec_a[2]);
    double res2 = func_b(vec_b);
    // Do something...
}

可能有更多通用的解决方案可以执行您想要的操作,但是您必须澄清目标。

顺便说一下,关于f2

double f2(std::vector<double> vec);

您可以通过引用/ const引用传递向量以避免数据复制:

double f2(const std::vector<double> &vec);

编辑-使用可变参数函数求解

一些通用的方法可能是:
template<typename FuncA, typename FuncB, typename FB_Param, typename ...FA_Params>
void compare(FuncA func_a, FuncB func_b, FB_Param b_param, FA_Params ...a_params) {
    func_a(a_params...);
    func_b(b_param);
}

该呼叫可能看起来像这样:

compare(f1, f2, std::vector<double>{1.0, 2, 3}, 1.0, 2.3, 1.3);

但是要注意的最重要的一点是,您不能在同一个函数中合并两个可变参数,因此传递给此函数的函数之一应接受单个参数(在此示例中为func_b)。


编辑-使用std :: apply support解决

由于@ fT3g0的想法是将元组用于多个值,因此这是我的c ++ 20版本:将参数传递为std :: tuples / std :: arrays / std :: pair /支持std :: apply实现的任何东西

template<typename Type>
concept ApplySupporter =
    requires (Type t) {
        { std::get<std::tuple_size<Type>() - 1>(t) };
        { std::tuple_size<Type>() };
    };

template<typename FuncA, ApplySupporter FA_Params, typename FuncB, ApplySupporter FB_Params>
void compare(FuncA func_a, FA_Params a_params, FuncB func_b, FB_Params b_params) {
    std::cout << std::apply(func_a, a_params) << std::endl;
    std::cout << std::apply(func_b, b_params) << std::endl;
}

阅读

性病::应用
概念
性病::获取
性病::元组大小

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

函数指针作为模板参数和签名

来自分类Dev

void **指针和void * []作为函数参数

来自分类Dev

如何使用默认参数和任意参数创建函数

来自分类Dev

可变参数函数和任意参数保存以供将来执行

来自分类Dev

如何接受带有任意数量参数的函数的指针(作为C中的参数)并调用它?

来自分类Dev

在C函数内部具有函数的参数和指针

来自分类Dev

具有void * a和指针函数作为参数的函数

来自分类Dev

函数指针和函数由于参数不兼容

来自分类Dev

接受lambda函数和函数指针作为参数

来自分类Dev

函数参数与函数参数的指针?

来自分类Dev

指向C ++中未定义函数和参数的指针

来自分类Dev

具有可变参数化和类型的C函数指针

来自分类Dev

生命周期参数和函数指针出现问题

来自分类Dev

数组和指针在c中作为函数参数的区别

来自分类Dev

指针和引用作为函数中的参数

来自分类Dev

指向同时接受const和非const参数的函数的指针

来自分类Dev

传递一个接受任意数量和类型参数的函数作为类模板参数

来自分类Dev

在函数调用中被单指针和双指针参数混淆

来自分类Dev

处理函数和指针

来自分类Dev

Pthread和函数指针

来自分类Dev

Pthread和函数指针

来自分类Dev

指针和函数

来自分类Dev

获得函数指针和类指针的函数?

来自分类Dev

C ++指针函数和非指针函数

来自分类Dev

使用任意函数作为模板参数参数

来自分类Dev

以任意数量的参数作为参数的函数

来自分类Dev

指向Swift函数中的指针参数的指针

来自分类Dev

从以指针为参数的函数返回指针

来自分类Dev

没有参数中的指针的函数指针