首页 > 编程语言 >C++11 中的闭包

C++11 中的闭包

时间:2024-08-04 22:43:24浏览次数:13  
标签:11 闭包 int 捕获 C++ std include lambda

什么是闭包?

闭包是一种可以捕获其创建环境中的变量的函数。闭包允许函数在离开其创建环境后仍然访问和操作这些变量。

Lambda表达式

lambda表达式的基本语法如下:

[capture](parameters) -> return_type { // function body };
    capture:指定哪些外部变量可以在lambda表达式中使用。
    parameters:指定函数参数(可选)。
    return_type:指定返回类型(可选,如果能从函数体推断出来,可以省略)。
    function body:函数的具体实现。

 

捕获方式

在lambda表达式中,capture部分指定了哪些变量以及如何捕获它们。捕获方式包括:

  • 按值捕获(默认):[x]
  • 按引用捕获:[&x]
  • 捕获所有变量(按值):[=]
  • 捕获所有变量(按引用):[&]
  • 混合捕获:[x, &y]

示例代码

下面是一些示例代码,展示了如何使用lambda表达式和闭包:

按值捕获

#include <iostream> int main() 
{
  int x = 10;
  auto lambda = [x]()
  {
    return x + 1;
};
std::cout << lambda() << std::endl; // 输出 11
}

按引用捕获

#include <iostream> int main() { 
   int x = 10; 
auto lambda = [&x]() {x += 1; };
lambda();
std::cout << x << std::endl; // 输出 11
}

捕获所有变量(按值和按引用)

#include <iostream> int main() {
int x = 10;
int y = 20;
auto lambda = [=]() { return x + y; };
std::cout << lambda() << std::endl; // 输出 30
}

 

#include <iostream> int main() {
int x = 10; int y = 20;
auto lambda = [&]() { x += y; };
lambda();
std::cout << x << std::endl; // 输出 30
}

混合捕获

#include <iostream> int main() {
int x = 10;
int y = 20;
auto lambda = [x, &y]() { y += x; };
lambda();
std::cout << y << std::endl; // 输出 30
}
在实际应用中的示例

以下是一个更复杂的示例,展示了如何使用闭包在C++中进行事件处理:

#include <iostream> 
#include <functional>
#include <vector>

class Event {
public:
void connect(std::function<void(int)> const& slot) {slots.push_back(slot); }
void trigger(int value) { for (auto const& slot : slots) { slot(value); }
}

private:
std::vector<std::function<void(int)>> slots;
};

int main() {
Event event;
int count = 0;
event.connect([&count](int value) {
count += value; std::cout << "Count is now " << count << std::endl; });
event.trigger(5); // 输出 "Count is now 5" event.trigger(3); // 输出 "Count is now 8" return 0;
}

在这个示例中,lambda表达式捕获了变量count,并在事件触发时修改它。这样,可以在事件系统中方便地使用闭包来管理状态。

标签:11,闭包,int,捕获,C++,std,include,lambda
From: https://www.cnblogs.com/ai-ldj/p/18342339

相关文章

  • 24411-Jupyter离线安装与配置
    修改路径修改解析环境离线安装说明通常在没网的情况下安装jupyter比较复杂,建议在有网络的情况下使用Anaconda创建临时的虚拟环境。然后将整个环境打包放到无网络的状态,并变无网络状态下的所有jupyter的文件头注释,将其改为当前的Python解释器即可。新的Python安装路径是:/home......
  • C++11 中 声明式的编程风格
    //SetatargetPoseautoconsttarget_pose=[]{geometry_msgs::msg::Posemsg;msg.orientation.w=1.0;msg.position.x=0.28;msg.position.y=-0.2;msg.position.z=0.5;returnmsg;}();move_group_interface.setPoseTarget(target_pose);//......
  • 《802.11无线网络权威指南-无线网络导论》-- 读书笔记1
    专业术语发射塔:celltower,指信号发射塔基站,接入点:accesspoint无线数据网络:wirelessdatanetwork基站:basestationauthorization:授权,认证serviceprovider:服务供应商hotspot:热点WAN:广域网络infraredlight:红外线频带:frequencyband带宽:bandwidth,即可供使用的频率......
  • Ros2 Moveit2 第一个C++项目
     本教程将指导您使用MoveIt编写第一个C++应用程序。警告:MoveIt中的大多数功能将无法正常工作,因为完整的MoveGroup功能需要附加参数。如需完整设置,请继续阅读MoveGroupC++接口教程。先决条件如果您还没有这样做,请确保您已经完成入门指南中的步骤。本教程假设您了......
  • 【C++从小白到大牛】栈和队列(优先级队列)
    目录引言:使用方法篇:stack:queuepriority_queue使用方法:模拟实现篇:stack:原码:queue原码:priority_queue插入和删除数据的思想:仿函数实现比较原码:引言:本文主要讲解C++STL库中stack、queue、priority_queue的使用方法和模拟实现。我们首先需要对stack、queue进......
  • 希尔排序, 插入排序, 冒泡排序, 选择排序【C++】
    希尔排序,插入排序,冒泡排序,选择排序测试代码希尔排序选择排序冒泡排序插入排序测试代码#include<iostream>usingnamespacestd;intmain(){intarr[6]={0};intlen=sizeof(arr)/sizeof(int);for(inti=0;i<len;i++){......
  • c++编写生产者消费者模型
    直接上代码啦:#include<iostream>#include<queue>#include<thread>#include<mutex>#include<condition_variable>#include<stdexcept>//定义一个同步的队列类classSyncQueue{public:SyncQueue(size_tcapacity):max_capacity(c......
  • windows C++-通过 C++/WinRT 使用 API(三)
    统一构造在C++/WinRT版本2.0及更高版本中,有一种优化的构造形式可供你使用,它被称作“统一构造”(请参见C++/WinRT2.0中的新增功能和更改)。若要使用统一构造而不是winrt::make,你需要一个激活工厂。要生成激活工厂,一种好的方式是向IDL添加构造函数。//MainPage.idl......
  • 【ESP01开发实例】-ESP-01驱动DHT11和DH22传感器
    ESP-01驱动DHT11和DH22传感器文章目录ESP-01驱动DHT11和DH22传感器1、DHT11/DHT22传感器介绍2、LCD1602介绍3、硬件准备与接线4、代码实现本主题介绍如何使用DHT11和DHT22相对湿度和温度传感器与ESP8266ESP-01Wi-Fi模块,将相对湿度和温度的测量值显......
  • windows C++-通过 C++/WinRT 使用 API(二)
    延迟初始化在C++/WinRT中,每个类型都有一个特殊的C++/WinRTstd::nullptr_t构造函数。除了该构造函数,所有其他类型的构造函数(包括默认的构造函数)都会导致系统创建一个支持的Windows运行时对象,并为你提供它的智能指针。因此,该规则适用于使用默认构造函数的任何地方,例如......