C++之lambda表达式使用解读

今天来详细解读一下C++中的这种表达:

cpp 复制代码
auto reset_horn_state = [&]() {
    horn_count_ = 0;
    control_command->mutable_signal()->set_horn(false);
    AINFO << "horn count reset to 0";
  };

这是一个C++中的lambda表达式

语法结构解析

cpp 复制代码
auto reset_horn_state = [&]() {
    horn_count_ = 0;
    control_command->mutable_signal()->set_horn(false);
    AINFO << "horn count reset to 0";
};

1. auto reset_horn_state =

  • auto:自动类型推导,让编译器推断lambda的类型
  • reset_horn_state:给这个lambda函数起的变量名

2. [&] - 捕获列表

  • [&] 表示以引用方式捕获所有外部变量
  • 在lambda函数内部可以访问和修改所有当前作用域内的变量
  • 具体捕获了:
    • horn_count_(成员变量)
    • control_command(函数参数)
    • horn_conf等局部变量

3. () - 参数列表

  • 空括号 () 表示这个lambda函数不接受任何参数

4. 函数体 { ... }

包含三条执行语句:

cpp 复制代码
{
    horn_count_ = 0;                           // 重置计数器
    control_command->mutable_signal()->set_horn(false);  // 关闭喇叭
    AINFO << "horn count reset to 0";          // 输出日志
}

使用方式

定义后,可以像普通函数一样调用:

cpp 复制代码
reset_horn_state();  // 执行重置操作

等价的传统函数写法

如果用传统函数实现,需要这样写:

cpp 复制代码
// 需要在类中声明成员函数
void ResetHornState() {
    horn_count_ = 0;
    control_command->mutable_signal()->set_horn(false);
    AINFO << "horn count reset to 0";
}

// 或者传递所有需要的参数
void ResetHornState(int& horn_count, ControlCommand* control_command) {
    horn_count = 0;
    control_command->mutable_signal()->set_horn(false);
    AINFO << "horn count reset to 0";
}

Lambda的优势

  1. 封装性:将相关操作打包成一个逻辑单元
  2. 避免重复:在多个地方调用相同的重置逻辑
  3. 作用域控制:只在当前函数内可见,不污染类接口
  4. 捕获便利:自动捕获所需变量,无需手动传递参数

其他捕获方式

  • [=]:以值方式捕获(不能修改外部变量)
  • [horn_count_, control_command]:只捕获特定变量
  • [&horn_count_, control_command]:以引用方式捕获特定变量
  • [this]:捕获当前类的this指针

这种写法让代码更加模块化可维护,特别是在多个地方需要执行相同重置操作的场景下。

扩展学习巩固

学习解读一下一下代码:

cpp 复制代码
auto set_horn_and_log = [&](bool horn_state, const std::string& phase) {
    control_command->mutable_signal()->set_horn(horn_state);
    AINFO << "[horn controller]: " << phase << ", horn count: " << horn_count_;
  };
相关推荐
h_a_o777oah1 小时前
状态机+划分型 DP :深度解析K-划分问题下 DP 状态的转移逻辑(洛谷P2679 P2331 附C++代码)
c++·算法·动态规划·acm·状态机dp·划分型dp·滚动数组优化
雪度娃娃3 小时前
Asio异步读写——连接的安全回收问题
开发语言·c++·安全·php
不吃土豆的马铃薯3 小时前
Spdlog 进阶:日志基本控制、日志格式控制、异步记录器
linux·服务器·开发语言·前端·c++
liulilittle3 小时前
TCP UCP:基于卡尔曼滤波的BBR增强型拥塞控制算法
linux·网络·c++·tcp/ip·算法·c·通讯
咩咦4 小时前
C++学习笔记26:static 静态成员
c++·学习笔记·static·静态成员变量·静态成员·静态成员函数
秋落风声4 小时前
内存池仿Nginx C++实现
c++·nginx
小白要努力sgy4 小时前
实时通信框架CyberRT
c++·自动驾驶·实时通讯
hansang_IR4 小时前
【记录】loj2967「COCI 2010.03.06」PROGRAM
c++·算法
霍霍的袁6 小时前
【C++初阶】缺省参数(默认参数)详细讲解
开发语言·c++·算法
楼田莉子6 小时前
C++17新特性:optional/variant/any/string_view
c++·后端·学习