回调函数,顾名思义,就是在一个函数内部调用另一个函数。在C++11标准中,回调函数得到了极大的扩展和增强,使得现代C++编程变得更加灵活和高效。本文将带你入门回调函数,让你轻松掌握现代C++编程技巧。

一、什么是回调函数?

回调函数是一种函数调用方式,它允许我们将一个函数的地址作为参数传递给另一个函数。这样,在执行到这个参数的时候,就可以调用传递进来的函数。

在C++中,回调函数通常用于以下场景:

  1. 事件处理:当某个事件发生时,调用一个回调函数来处理这个事件。
  2. 函数指针:将函数指针传递给其他函数,以便在需要的时候调用。
  3. 模板编程:在模板函数中,将函数指针作为参数传递,实现更通用的编程。

二、C++11中的回调函数

C++11对回调函数进行了扩展,使得使用回调函数变得更加简单和方便。

1. lambda表达式

lambda表达式是C++11引入的一种新的匿名函数声明方式。它允许我们在需要回调函数的地方直接定义一个匿名函数,而不需要单独编写一个函数。

#include <iostream>
#include <vector>

int main() {
    std::vector<int> vec = {1, 2, 3, 4, 5};
    for (auto& num : vec) {
        [num]() {
            std::cout << num << std::endl;
        }();
    }
    return 0;
}

在上面的代码中,我们使用lambda表达式直接在for循环中打印出vec中的每个元素。

2. auto关键字

C++11中的auto关键字可以自动推导变量类型,这使得使用回调函数时,我们不需要关心函数参数的类型。

#include <iostream>
#include <vector>

int main() {
    std::vector<int> vec = {1, 2, 3, 4, 5};
    std::sort(vec.begin(), vec.end(), [](int a, int b) {
        return a < b;
    });
    for (auto& num : vec) {
        std::cout << num << std::endl;
    }
    return 0;
}

在上面的代码中,我们使用lambda表达式作为sort函数的第三个参数,用于比较两个元素的大小。

3. std::function

std::function是C++11中引入的一个函数对象包装器,它可以存储、传递和调用任何可调用目标。

#include <iostream>
#include <functional>

int main() {
    std::function<void(int)> func = [](int x) {
        std::cout << x << std::endl;
    };
    func(10);
    return 0;
}

在上面的代码中,我们使用std::function存储了一个lambda表达式,并调用它来打印数字10。

三、总结

回调函数是现代C++编程中非常重要的一种技巧,它使得代码更加灵活和高效。通过本文的学习,相信你已经对回调函数有了初步的了解。在实际编程中,多加练习和运用,你会逐渐掌握现代C++编程技巧。