将函数作为参数传递。 C++

Posted

技术标签:

【中文标题】将函数作为参数传递。 C++【英文标题】:Pass a function as a parameter. C++ 【发布时间】:2021-01-28 11:01:35 【问题描述】:

我知道这个问题可能已经重复了很多次,但我不明白他们的答案。所以我们开始:

我有一个double* 类型的数组,它作为一个名为arr 的指针传递,数组的大小作为int arrsize 参数传递。现在,这里是我感到困惑的地方,我想使用参数val 对数组中的元素执行函数指针typeOfOper 指定的操作。

void fnOper(double *arr, int arrsize, void (*typeOfOper)(double*, int, const double), const double val);

我还有四个执行不同类型操作的函数(addsubtractdividemultiply)。同样,根据传递的操作类型 (typeOfOper),该函数将执行其他四个函数之一。

如果有人可以指导我并让我知道我能做什么,我将不胜感激。感谢您的宝贵时间。

【问题讨论】:

不清楚这里的障碍是什么?我看没有真正的问题,你只是调用给定的函数吗?从一个函数开始构建示例 调用fnOper时只需在参数中输入函数名称,不带括号。 我正在尝试学习如何将函数作为参数传递,所以这是我自己做的最简单的方法。 【参考方案1】:

以下是您的示例的用法示例。我可以使用指向本地函数operSumoperSubstract 的指针调用函数fnOper,如下所示:

    // call with sum
    fnOper(arrList, arrListSize, operSum, 15.3);
    // call with substract
    fnOper(arrList, arrListSize, operSubstract, 15.3);

这是完整的编译示例:

#include <iostream>

void operSubstract(double* a, int sizeOfa, const double z) 
    for (int i=0; i<sizeOfa; i++)
    
        std::cout << std::fixed << *(a+i) << " MINUS ";
    
    std::cout << z;
    std::cout << std::endl;


void operSum(double* a, int sizeOfa, const double z) 

    for (int i=0; i<sizeOfa; i++)
    
        std::cout << std::fixed << *(a+i) << " PLUS ";
    
    std::cout << z;
    std::cout << std::endl;


void fnOper(double *arr, int arrsize, void (*typeOfOper)(double* x, int y, const double z), const double val)

    (*typeOfOper)(arr, arrsize, val);


int main()

    // to display only 2 floating points to be good looking
    std::cout.precision(2);

    // preparation of actual arguments to use the functions with
    double arrList[] = 25.3, 15.2, 3.6;


    int arrListSize = sizeof(arrList)/sizeof(double);
    // call with sum
    fnOper(arrList, arrListSize, operSum, 15.3);

    // call with substract
    fnOper(arrList, arrListSize, operSubstract, 15.3);


结果如下所示:

25.30 PLUS 15.20 PLUS 3.60 PLUS 15.30
25.30 MINUS 15.20 MINUS 3.60 MINUS 15.30

【讨论】:

天啊,我真是个白痴。老实说,由于某种原因,我无法绕开它。看起来很愚蠢,但谢谢你的回答。【参考方案2】:

我们经常可以使用std::function&lt;void(double*, size_t)&gt; 来保存函数和类函数对象。最大的优势是您不再需要单独的const double val

void fnOper(double *arr, size_t len, std::function<void(double*, size_t)> fun)

  fun(arr, len); // Simple


template <size_t LEN>
void fnOper(double (&arr)[LEN], std::function<void(double*, size_t)> fun)

  fun(arr, LEN); // Can also work on arrays

void add5 (double* ptr, size_t len)  
   for (size_t i = 0; i != len; ++i) ptr[i] += 5.0;

double d[] =  2.0,3.0,4.0 
fnOper(d, add5)

但我们通常不会编写这样的代码 - 当我们想要遍历数组、向量或列表时,已经有 std::transform

【讨论】:

以上是关于将函数作为参数传递。 C++的主要内容,如果未能解决你的问题,请参考以下文章

c++ - 如何将void函数作为参数传递?

从 C++ 调用 python 函数时如何将 C++ 类作为参数传递?

QT怎样将一个结构体作为函数参数从C++传递到QML

如何使用 swig 将 python 类实例作为 c++ 函数的参数传递?

SWIG:Lua - 将 c++ 实例作为 lua 函数参数传递

C++:尝试将 fstream 作为参数传递时删除了函数?