C++之lambda表达式使用解读
今天来详细解读一下C++中的这种表达:
auto reset_horn_state = [&]() {horn_count_ = 0;control_command->mutable_signal()->set_horn(false);AINFO << "horn count reset to 0";};
这是一个C++中的lambda表达式
语法结构解析
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. 函数体 { ... }
包含三条执行语句:
{horn_count_ = 0; // 重置计数器control_command->mutable_signal()->set_horn(false); // 关闭喇叭AINFO << "horn count reset to 0"; // 输出日志
}
使用方式
定义后,可以像普通函数一样调用:
reset_horn_state(); // 执行重置操作
等价的传统函数写法
如果用传统函数实现,需要这样写:
// 需要在类中声明成员函数
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的优势
- 封装性:将相关操作打包成一个逻辑单元
- 避免重复:在多个地方调用相同的重置逻辑
- 作用域控制:只在当前函数内可见,不污染类接口
- 捕获便利:自动捕获所需变量,无需手动传递参数
其他捕获方式
[=]:以值方式捕获(不能修改外部变量)[horn_count_, control_command]:只捕获特定变量[&horn_count_, control_command]:以引用方式捕获特定变量[this]:捕获当前类的this指针
这种写法让代码更加模块化和可维护,特别是在多个地方需要执行相同重置操作的场景下。
扩展学习巩固
学习解读一下一下代码:
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_;};
