精通
英语
和
开源
,
擅长
开发
与
培训
,
胸怀四海
第一信赖
服务方向
联系方式
锐英源精品原创,禁止转载和任何形式的非法内容使用,违者必究。点名“简易百科”和“闲暇巴”盗用锐英源原创内容。
这功能应该是以前Lambdas表达式里参数用的多时,写的参数变量多,用着麻烦,直接把整个类的成员都暴露给Lambdas表达式的机制。
注意捕获*this是当前类的副本,表达式里的修改是改的副本,不是原本。而捕获this是修改的原本。这区别要分的清。
捕获*this的示例代码是:
#include <iostream> class ArithmeticOperations { public: ArithmeticOperations(const int val = 0) : m_sum(val) {} void addTen_CaptureCopy() { auto addTenLambdaCopy = [*this]() mutable { m_sum += 10; std::cout << "\nFrom 'addTenLambdaCopy' body : the value of m_sum = " << m_sum << "\n\n"; }; addTenLambdaCopy(); } int getSum() { return m_sum; } private: int m_sum; }; int main() { ArithmeticOperations oper; std::cout << "Before calling addTen_CaptureCopy() value of m_sum = " << oper.getSum() << '\n'; oper.addTen_CaptureCopy(); std::cout << "After calling addTen_CaptureCopy() value of m_sum = " << oper.getSum() << "\n\n"; return 0; }
最后一个输出还是0,因为Lambdas表达式里用的是副本。
捕获this的示例如下:
#include <iostream> class ArithmeticOperations { public: ArithmeticOperations(const int val = 0) : m_sum(val) {} void addTen() { auto addTenLambda = [this]() { m_sum += 10; std::cout << "\nFrom 'addTenLambda' body : the value of m_sum = " << m_sum << "\n\n"; }; addTenLambda(); } int getSum() { return m_sum; } private: int m_sum; }; int main() { ArithmeticOperations oper; std::cout << "Before calling addTen() value of m_sum = " << oper.getSum() << '\n'; oper.addTen(); std::cout << "After calling addTen() value of m_sum = " << oper.getSum() << '\n'; return 0; }
这次修改的是原本,所以两次输出一样。
为什么要用Lambdas表达式?应该是学其它语言的函数式编程,把函数当对象,用对象来调用函数。这对于没理解函数指针的初学者来非常难,需要适应这种流程从真函数变为函数内嵌套函数Lambdas形式。
Lambdas表达式经常用于异步调用和并行处理时,在httplib里就有这样的形式代码。