首页 > 编程语言 >c++ lambda表达式捕获类数据…

c++ lambda表达式捕获类数据…

时间:2023-03-07 11:00:56浏览次数:37  
标签:would int Kitty c++ toys gave total 表达式 lambda

lambda表达式允许捕获局部变量,但是数据成员不是局部变量。用一种特殊的方法,你可以捕获“this”:。
using namespace std;
class Kitty {
public:
explicit Kitty(int toys) : m_toys(toys) { } void meow(const vector& v) const {
for_each(v.begin(), v.end(), [this](int n) {
cout << "If you gave me " << n << " toys, I would have " << n + m_toys << " toys total." << endl;
});
}private:
int m_toys;
};int main() {
vector v; for (int i = 0; i < 3; ++i) {
v.push_back(i);
} Kitty k(5);
k.meow(v);
}If you gave me 0 toys, I would have 5 toys total.
If you gave me 1 toys, I would have 6 toys total.
If you gave me 2 toys, I would have 7 toys total.当你捕获了this以后,m_toys就可以使用了,它隐式的表示this->m_toys,你也可以显示的说明this->m_toys。(在lambda表达式中,只有捕获了this后才可以使用它,你永远无法得到lambda表达式本身的this指针)
你也可以隐式的捕获this:
using namespace std;
class Kitty {
public:
explicit Kitty(int toys) : m_toys(toys) { } void meow(const vector& v) const {
for_each(v.begin(), v.end(), [=](int n) {
cout << "If you gave me " << n << " toys, I would have " << n + m_toys << " toys total." << endl;
});
}private:
int m_toys;
};int main() {
vector v; for (int i = 0; i < 3; ++i) {
v.push_back(i);
} Kitty k(5);
k.meow(v);
}C:\Temp>cl /EHsc /nologo /W4 implicitmemberkitty.cpp > NUL && implicitmemberkitty
If you gave me 0 toys, I would have 5 toys total.
If you gave me 1 toys, I would have 6 toys total.
If you gave me 2 toys, I would have 7 toys total.

你也可以使用“[&]”,但是它不会影响this的捕获方式(永远按值传递)。“[&this]”是不允许的。

 

上面代码不是自己的,今天做到c++ primer(第五版) 13.43 遇到了问题,查了查,然后记下来了

 

标签:would,int,Kitty,c++,toys,gave,total,表达式,lambda
From: https://blog.51cto.com/u_15995687/6105512

相关文章

  • C++中使用interface
    C++中使用interface使用struct;不使用成员变量,只使用成员函数;所有成员函数都是纯虚的;不使用构造函数和析构函数;参考C++的interface_c++interface_Stephan_zry的博......
  • C/C++教师工资管理系统[2023-03-06]
    C/C++教师工资管理系统[2023-03-06]题目描述:每个教师的月工资信息为:教师号、姓名、性别、单位名称、联系电话、基本工资、津贴、生活补贴、应发工资、电话费、水电费、房......
  • C++ yolov5 jetson NX盒子部署安全帽检测 TensorRT, 支持INT8/FP16
    C++yolov5 jetson NX盒子部署安全帽检测TensorRT,支持INT8/FP16安全帽检测,用C++实现,部署到Nvidia上,tensorrt加速,最新的yolov5部署,支持s,m,l模型和int8,FP16等选择......
  • 浅谈C++的boolean类型
    在C++语言中,boolean类型有所不同:数字0与false等价,而非0数字与true等价.对于有过其它编程语言的人来讲,可能需要一个适应的过程。#include<iostream>intmain(){ in......
  • 初识C++
    写在前面这是我第一次接触到C++,之前对它的大名可谓是如雷贯耳.这两天有人问我学习C++的感觉怎么样?对此我想说,很难.C++的细节很多,要求我们比学习C语言更加细心,我不是没......
  • c++基础学习路线
    c++基础学习路线类和对象c/c++内存管理模板IO流继承多态c++11新特新异常智能指针特殊类设计c++的类型转换STL......
  • C++质因数分解
    朴素算法从\([2,\sqrt(N)]\)进行遍历vector<int>GetFactor(intN){vector<int>res;for(inti=2;i*i<=N;++i){if(N%i==0){......
  • 快速重温C# 委托,匿名方法,Lambda,泛型委托,表达式树
    第一:委托有些教材,博客说到委托都会提到事件,虽然事件是委托的一个实例,但是为了理解起来更简单,今天只谈委托不谈事件。先上一段代码:下边的代码,完成了一个委托应用的演示。......
  • C/C++ 数据结构链栈的基本操作实现
    #include<iostream>#include<string.h>usingnamespacestd;typedefintSElemType;typedefstructStackNode{SElemTypedata;structStackNode*next;......
  • Lambda表达式
    Lambda表达式使用前提:1、有一个接口;2、接口有且只有一个抽象方法。Lambda表达式的标准格式:(形式参数)->{代码块},如果有多个形式参数,逗号隔开,没有参数留空即......