c++中function和lambda函数的学习

2023-12-15 07:14:01

在C++中,std::function 是一个通用的函数封装器,可以用于存储、传递和调用任何可调用对象,如函数、函数指针、成员函数指针、lambda 表达式等。当std::function对象实例未包含任何实际可调用实体时,调用该std::function对象实例将抛出std::bad_function_call异常。以下是一些基本用法示例:

#include <iostream>
#include <functional>

// 定义一个普通函数
int add(int a, int b) {
    return a + b;
}

// 定义一个函数对象(仿函数)
struct Multiply {
    int operator()(int a, int b) {
        return a * b;
    }
};

int main() {
    // 使用 std::function 存储普通函数
    std::function<int(int, int)> func1 = add;
    std::cout << "func1(2, 3): " << func1(2, 3) << std::endl;

    // 使用 std::function 存储 lambda 表达式
    auto lambda = [](int a, int b) { return a - b; };
    std::function<int(int, int)> func2 = lambda;
    std::cout << "func2(5, 2): " << func2(5, 2) << std::endl;

    // 使用 std::function 存储函数对象(仿函数)
    std::function<int(int, int)> func3 = Multiply();
    std::cout << "func3(4, 6): " << func3(4, 6) << std::endl;

    return 0;
}

在这个例子中,std::function 的模板参数是函数的签名,即函数的参数类型和返回类型。然后,可以将不同类型的可调用对象赋值给 std::function 对象,然后通过该对象调用对应的函数。

?c++11引入了Lambda表达式,使得开发人员可以更方便的创建匿名函数。Lambda表达式是c++语言的一个重要特性,它可以作为函数对象使用,可以用来替代一些繁琐的函数声明和定义。

Lambda函数表达式的结构如下:

[capture list] (parameter list) specifiers exception -> type { function body }

?

  • [capture list]是捕获列表,在应用中必填。

  • (parameter list)是参数列表,在应用中选填。

  • specifiers是限定符,在应用中选填。

  • exception是异常说明符,在应用中选填。

  • -> type是返回值类型,在应用中选填。

  • { function body }是表达式的函数体,在应用中必填。

?捕获列表可以为空,也可以包含一个或多个捕获项。捕获项有两种形式:按值捕获和按引用捕获。

按值捕获

在这个例子中,[x] 表示按值捕获变量 x。Lambda 表达式内部使用 x,但不修改外部的 x

int x = 10;
auto lambda_by_value = [x]() {
    // 使用 x,但不修改 x
    std::cout << x << std::endl;
};

按引用捕获

在这个例子中,[&y] 表示按引用捕获变量 y。Lambda 表达式内部修改了外部的 y

int y = 20;
auto lambda_by_reference = [&y]() {
    // 修改外部的 y
    y++;
    std::cout << y << std::endl;
};

混合捕获

int a = 5;
int b = 3;

auto lambda_mixed = [a, &b]() {
    // 使用 a,但不修改 a;修改外部的 b
    std::cout << a << ", " << b << std::endl;
};

此外,还可以使用 = 表示按值捕获所有外部变量,使用 & 表示按引用捕获所有外部变量。

int c = 7;
int d = 9;

auto lambda_capture_all_by_value = [=]() {
    // 使用 c 和 d,但不修改它们
    std::cout << c << ", " << d << std::endl;
};

auto lambda_capture_all_by_reference = [&]() {
    // 修改外部的 c 和 d
    c++;
    d++;
    std::cout << c << ", " << d << std::endl;
};

Lambda表达式的参数列表与普通函数参数列表一致;如果不需要参数,则可以省略此项。?

文章来源:https://blog.csdn.net/weixin_47315136/article/details/134867465
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。