当前位置: 首页 > news >正文

C++ lambda闭包消除类成员变量

原文链接:https://blog.csdn.net/qq_51470638/article/details/142151502

一、背景

在面向对象编程时,常常要添加类成员变量。

然而类成员一旦多了之后,也会带来干扰。

拿到一个类,一看成员变量好几十个,就问你怕不怕?

二、解决思路

可以借助函数式编程思想,来消除一些不必要的类成员变量。

三、实例

举个例子:

class ClassA{
public:...int funcA(){m_valueA += 10;return m_valueA;}int funcB(){m_valueB += 100return m_valueB;}
private:int m_valueA = 0;int m_valueB = 0;
};

上面的类中,m_valueA仅仅被funcA()使用,m_valueB仅仅被funcB()使用,如果这些变量作为类成员:

  1. 对于那些不需要使用它们的方法而言,是一种干扰;
  2. 同时,也会让这些变量不那么可控,因为控制者无法保证其他方法不会修改它;

可以写成:

class ClassA {
public:ClassA(){{int valueA;m_funcA = [=] () mutable -> int {valueA += 10;return valueA;};}{int valueB;m_funcB = [=] () mutable -> int {valueB += 100;return valueB;};}}...int funcA (){return m_funcA();}int funcB (){return m_funcB();}
private:std::function<int()> m_funcA = nullptr;std::function<int()> m_funcB = nullptr;
};

这样,就把m_valueAm_valueB消除了——通过将它们闭包到lambda表达式中,然后将这个lambda存起来重复使用。

需要注意的是mutable修饰符和=值捕获。如果用引用捕获,栈变量会释放导致非法访存;如果不加mutable就无法修改值捕获的变量。

当然,lambda的初始化时机也可以更改,例如放到使用时,同时也做了判空更加健壮:

class ClassA {
public:int funC (){printf ("hello world");}int funcA (){if (!m_funcA) {int valueA;m_funcA = [=] () mutable -> int {valueA += 10;return valueA;};}return m_funcA();}int funcB (){if (!m_funcB) {int valueB;m_funcB = [=] () mutable -> int {valueB += 100;return valueB;};}return m_funcB();}
private:std::function<int()> m_funcA = nullptr;std::function<int()> m_funcB = nullptr;
};
http://www.lryc.cn/news/435544.html

相关文章:

  • 等待唤醒机制和阻塞队列
  • IO多路复用是如何处理多个客户端同时访问一个数据的
  • QT中使用UTF-8编码
  • 我对 monorepo 的一些思考
  • Java学习Day41:骑龙救!(springMVC)
  • Redis 常用命令总结
  • Mysql SqlServer 分页
  • 电子支付原理
  • 什么是OAuth 2.0?OAuth 2.0的工作流程是什么?与OAuth 1.0有哪些区别?
  • Unity+LeapMotion2的使用
  • 【CanMV K230 AI视觉】 跌倒检测
  • 谈谈PCIe VID、DID、SSID、SSVID背后的智慧
  • 9月11日
  • 昇腾310内存拷贝测试
  • ‘$store‘ is not defined.
  • 如何利用Linux提升工作效率和安全性?
  • 初始Linux 和 各种常见指令
  • 【稀疏矩阵】使用torch.sparse模块
  • 如何增加谷歌网站曝光率?
  • 虚幻中的c++(持续更新)
  • 83-MySQL 索引有几种
  • 文献解读-The trans-omics landscape of COVID-19
  • Unity核心实践小项目
  • Avaloia 实现国产麒麟系统中文显示界面
  • pytest 生成allure测试报告
  • 查询GPU版本以及PyTorch中使用单GPU和多GPU
  • 基于SpringBoot+Vue的线上考试系统
  • 动手学深度学习(pytorch土堆)-02TensorBoard的使用
  • STM3学习记录
  • 【网络】应用层协议-http协议