回调函数是指在某个事件发生或者异步操作完成时,由系统或程序自动调用的一个函数。回调函数通常作为参数传递给另一个函数,在操作完成后被调用。回调函数的作用是在异步操作完成后处理返回结果,或者在事件发生后执行相应的操作。回调函数常见于 JavaScript、Node.js 等语言和框架中。

C++ 回调函数示例

简单示例

#include <iostream>
#include <functional>

void foo(int x, int y, std::function<void(int)> callback) {
    int sum = x + y;
    callback(sum);
}

void bar(int result) {
    std::cout << 'foo() returned ' << result << std::endl;
}

int main() {
    foo(1, 2, bar);
    return 0;
}

在这个例子中,foo() 函数接受两个整数参数和一个回调函数参数 callback。在 foo() 函数内部,它计算了 xy 的和,并将该结果传递给回调函数 callback。在调用 foo() 时,我们将一个名为 bar 的函数作为回调函数传递给它。这意味着当 foo() 计算出 xy 的和时,它将调用 bar() 函数并将计算结果作为参数传递给它。在这种情况下,bar() 函数打印了计算结果。

此示例使用了 C++11 中的 std::function 和 lambda 表达式来定义回调函数,但您也可以使用任何可调用对象,例如全局函数、类成员函数或函数对象,作为回调函数来传递给 foo() 函数。

稍微复杂的示例

#include <iostream>
#include <vector>
#include <algorithm>
#include <functional>

void printVector(const std::vector<int>& vec) {
    std::cout << "Vector elements: ";
    for (const auto& elem : vec) {
        std::cout << elem << " ";
    }
    std::cout << std::endl;
}

void sortVector(std::vector<int>& vec, std::function<bool(int, int)> compareFunc) {
    std::sort(vec.begin(), vec.end(), compareFunc);
}

int main() {
    std::vector<int> vec = {4, 2, 1, 5, 3};
    std::cout << "Before sorting: ";
    printVector(vec);

    std::function<bool(int, int)> compareFunc = [](int a, int b) {
        return a < b;
    };

    sortVector(vec, compareFunc);

    std::cout << "After sorting: ";
    printVector(vec);

    return 0;
}

在这个例子中,我们定义了两个函数 printVector()sortVector(),并且在 main() 函数中使用了回调函数来实现对 sortVector() 函数的排序方式进行自定义。sortVector() 函数接受一个整数向量和一个回调函数参数 compareFunc,该函数用于指定向量元素的排序方式。在 main() 函数中,我们定义了一个 lambda 表达式作为回调函数,该表达式将向量元素按升序排序。最后,我们调用 sortVector() 函数并打印排序后的向量元素。

这个例子展示了回调函数的强大之处,它可以让我们在不改变函数本身的情况下,通过传递不同的回调函数来实现不同的功能。

回调函数的优势

  • 代码重用: 回调函数允许您在不修改函数本身的情况下,通过传递不同的回调函数来实现不同的功能。
  • 异步编程: 回调函数是异步编程的重要组成部分,它们允许您在操作完成时执行特定的操作,而无需阻塞主线程。
  • 灵活性和可扩展性: 回调函数允许您轻松地添加或更改函数的行为,而无需修改函数本身。
回调函数:定义、用途及 C++ 示例

原文地址: https://www.cveoy.top/t/topic/jI6v 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录