📌  相关文章
📜  在 C++ 中将函数作为参数传递(1)

📅  最后修改于: 2023-12-03 14:50:52.248000             🧑  作者: Mango

在 C++ 中将函数作为参数传递

在 C++ 中,函数也可以像其他数据类型一样作为参数传递给函数。这种特性可以帮助我们实现更灵活的编程模式,如回调函数和函数指针。

函数指针

函数指针是指向函数的指针变量。通过函数指针,我们可以将函数作为参数传递给其他函数。

定义函数指针的一般格式如下:

return_type (*pointer_name)(argument_types)

示例代码如下:

#include <iostream>

void square(int num) {
    std::cout << num * num << std::endl;
}

void cube(int num) {
    std::cout << num * num * num << std::endl;
}

void executeFunction(void (*func)(int), int num) {
    func(num);
}

int main() {
    int num = 5;
    executeFunction(square, num);
    executeFunction(cube, num);
    return 0;
}

上述代码中,我们定义了两个函数 square()cube(),它们分别计算参数的平方和立方。我们还定义了一个 executeFunction() 函数,该函数以函数指针作为参数,并调用该函数指针所指向的函数。

运行上述代码,输出结果为:

25
125
函数对象

在 C++11 及更高版本中,我们还可以使用函数对象(即仿函数)来传递函数作为参数。函数对象是一个类对象,它重载了函数调用操作符 operator()。通过函数对象,我们可以将函数作为参数传递给其他函数。

示例代码如下:

#include <iostream>

struct Square {
    void operator()(int num) {
        std::cout << num * num << std::endl;
    }
};

struct Cube {
    void operator()(int num) {
        std::cout << num * num * num << std::endl;
    }
};

void executeFunction(void (*func)(int), int num) {
    func(num);
}

int main() {
    int num = 5;
    executeFunction(Square(), num);
    executeFunction(Cube(), num);
    return 0;
}

上述代码中,我们定义了两个函数对象 SquareCube,它们重载了函数调用操作符 operator()。我们还定义了一个 executeFunction() 函数,该函数以函数指针作为参数,并调用该函数指针所指向的函数。

运行上述代码,输出结果与前面示例相同。

使用 lambda 表达式

C++11 还引入了 lambda 表达式,它可以更方便地定义匿名函数,并将其作为参数传递给其他函数。

使用 lambda 表达式时,我们可以直接在函数调用时定义匿名函数。示例代码如下:

#include <iostream>

void executeFunction(void (*func)(int), int num) {
    func(num);
}

int main() {
    int num = 5;
    executeFunction([](int num) {
        std::cout << num * num << std::endl;
    }, num);
    executeFunction([](int num) {
        std::cout << num * num * num << std::endl;
    }, num);
    return 0;
}

上述代码中,我们直接在 executeFunction() 函数调用时使用 lambda 表达式来定义匿名函数,并将其作为参数传递。

运行上述代码,输出结果与前面示例相同。

以上就是在 C++ 中将函数作为参数传递的介绍。函数指针、函数对象和 lambda 表达式都提供了灵活且强大的功能,使得我们能够更加灵活地编写函数式代码。