C++函数模板std-function对匿名函数的封装

大家节日快乐,一直对function函数有些许疑问,趁着假期好好研究了一下。这种方法在leetcode中尊嘟很好用!

一、 匿名函数

我们首先介绍一下匿名函数

在 C++ 中,匿名函数通常是通过 lambda 表达式来创建的,它是一种轻量级的、内联定义的函数,不需要显式命名。lambda 表达式的一般形式如下:

[capture_list](参数列表) -> 返回类型 {
    // 函数体
}
  • capture_list:捕获列表,用于指定 lambda 表达式可以访问的外部变量。可以为空,表示不捕获任何外部变量,也可以使用 [&][=] 等方式捕获外部变量。

capture_list

变量名(按值捕获): 如果您希望 lambda 函数在函数体内部拷贝外部变量的值,可以将这些变量的名称放在方括号中。这样,lambda 函数将拥有这些变量的副本,并且可以在函数体内部使用它们。

int x = 5;
auto lambda = [x](int y) { return x + y; };

变量名前加&(按引用捕获): 如果您希望 lambda 函数引用外部变量而不是拷贝它们的值,可以在变量名前加上&符号。

[&]:表示捕获外部变量时采用引用方式,lambda 函数内部可以修改外部变量的值。

cppCopy codeint x = 5;
auto lambda = [&x](int y) { return x + y; };

变量名前加=(默认方式捕获): 如果您希望编译器自动确定捕获方式,可以使用=符号。编译器会根据 lambda 函数体中变量的使用情况来决定是按值捕获还是按引用捕获。(不可修改捕获的外部参数)

cppCopy codeint x = 5;
auto lambda = [=](int y) { return x + y; }; // 编译器决定捕获方式

不捕获任何外部变量(空捕获列表): 如果 lambda 函数不需要访问任何外部变量,可以使用一个空的捕获列表[]

cppCopy code
auto lambda = []() { return 42; }; // lambda 函数不捕获任何变量

使用通用引用(C++14及更高版本): 如果您使用的是 C++14 及更高版本,还可以使用通用引用auto来捕获外部变量。这使得 lambda 函数更具通用性,可以接受不同类型的外部变量。

cppCopy code
auto lambda = [](auto x) { return x * 2; };

请注意,捕获列表中的内容决定了 lambda 函数能够访问和修改的外部变量。捕获方式(按值或按引用)和具体的变量名取决于您的需求。根据不同的情况,您可以选择合适的捕获方式和变量列表。

  • 参数列表:与普通函数的参数列表类似,用于定义 lambda 函数的参数。
  • 返回类型:指定 lambda 函数的返回类型。

实例代码如下

#include <iostream>

int main() {
    int x = 10;
    int y = 20;

    // 使用 lambda 表达式定义匿名函数
    auto add = [&x, &y](int a, int b) -> int {
        x++;
        y++;
        return a + b + x + y;
    };

    // 调用 lambda 函数
    int result = add(5, 5);

    std::cout << "Result: " << result << std::endl;

    return 0;
}

运行结果:

Result: 42

二、关于 std::function 对匿名函数的封装

std::function 是 C++ 标准库中的一个模板类,用于封装可调用对象,包括函数指针、成员函数指针、仿函数和 lambda 表达式等。它提供了一种通用的方式来管理和存储函数对象,使其可以像普通函数一样使用。您可以将匿名函数(lambda 表达式)或其他可调用对象分配给 std::function 对象,并将其作为参数传递给函数、存储在容器中等。

以下是示例代码,演示了如何使用 std::function 封装匿名函数:

#include <iostream>
#include <functional>

int main() {
    // 使用 std::function 封装 lambda 表达式
    std::function<int(int, int)> add = [](int a, int b) -> int {
        return a + b;
    };

    // 调用封装的 lambda 函数
    int result = add(5, 5);

    std::cout << "Result: " << result << std::endl;

    return 0;
}

运行结果

Result: 10

在这个示例中,我们首先创建了一个 std::function 对象 add,并将 lambda 表达式赋值给它。然后,我们可以像调用普通函数一样使用 add 来调用 lambda 函数。

这种封装使得我们可以将 lambda 函数传递给其他函数,存储在数据结构中,以及实现回调功能,使 C++ 中的函数操作更加灵活和通用。


最后祝大家国庆快乐,祝祖国繁荣昌盛~
节假日要劳逸结合,(明天我就要和我滴小可爱粗去玩耍辣!)
Logo

欢迎加入我们的广州开发者社区,与优秀的开发者共同成长!

更多推荐