使用C++11实现Golang的defer功能

本文主要用C++11标准来实现Golang的defer功能。

背景

目前笔者的主力语言是Golang,其次是C++,再次是JS、Delphi。在Golang工程中大量使用了defer关键字实现函数的延迟调用。如打开文件的出错处理。近来在C++工程中遇到类似需求,在函数返回时进行某次处理,但函数返回的地方较多,如在返回之前一一写上,略稍麻烦,幸好早有人实现了。

实现

网上的实现方法有很多种,这篇文章中的方法是比较简洁的。代码量不多,就直接抄录在此:

/*https://www.gingerbill.org/article/2015/08/19/defer-in-cpp/
使用:
defer ({printf("defer 0000\n");
});defer (foobar());c++11及以上标准*/#ifndef _MYHEAD_H
#define _MYHEAD_Htemplate <typename F>
struct privDefer {F f;privDefer(F f) : f(f) {}~privDefer() { f(); }
};template <typename F>
privDefer<F> defer_func(F f) {return privDefer<F>(f);
}#define DEFER_1(x, y) x##y
#define DEFER_2(x, y) DEFER_1(x, y)
#define DEFER_3(x)    DEFER_2(x, __COUNTER__)
#define mydefer(code)   auto DEFER_3(_defer_) = defer_func([&](){code;})#endif

调用代码片段如下:

void defer_func()
{printf("goodbye\n");
}void defer_test()
{mydefer ({printf("mydefer 0000\n");});mydefer ({printf("mydefer 11111\n");printf("mydefer 22222\n");});mydefer (defer_func());
}

编译示例:

g++ -std=c++1y -Wall main.cpp 

输出结果如下:

goodbye
mydefer 11111
mydefer 22222
mydefer 0000

小结

作为业务使用者,本着拿来主义的精神,直接上述代码就能实现功能。限于精力,不再深入研究C++的特性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/13196.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【ARMv8/v9 系统寄存器 6 -- EL 异常等级判定寄存器 CurrentEL 使用详细将介绍】

文章目录 ARMv8/v9 EL 等级获取EL 等级获取函数实现EL 等级获取测试 ARMv8/v9 EL 等级获取 下面这个宏定义是用于ARMv8/v9架构下&#xff0c;通过汇编语言检查当前执行在哪个异常级别&#xff08;Exception Level&#xff0c;EL&#xff09;并据此跳转到不同的标签。 异常级别…

【数据库】银行转账并发问题

假设账户A的余额是200&#xff0c;B、C分别给A转账100&#xff0c;A自己又消费了50&#xff0c;期望A的余额是350&#xff0c;那么如何做才能确保数据的一致性&#xff1f; 做法1&#xff1a;在代码里加同步锁&#xff08;推荐&#xff09; synchronized (lock) {try {// 查账…

svn批量解锁

问题 svn对文件进行checkout之后&#xff0c;先进行lock&#xff0c;之后再去更改&#xff0c;最后进行Commit操作&#xff1b; 上述为我们通过svn管理代码的正常方式&#xff0c;但总会有其他现象发生&#xff1b; 如果我们非正常操作&#xff0c;批量锁所有的svn文件&#x…

验证控件的学习

在ASP.NET Web Forms中&#xff0c;验证控件用于确保用户输入的数据满足特定的条件。ASP.NET 提供了一系列内置的验证控件&#xff0c;这些控件可以在服务器端或客户端执行验证。以下是一些常见的验证控件及其用法&#xff1a; RequiredFieldValidator&#xff1a;确保字段不为…

阿里云 服务之前设置的密钥登陆,关闭了密码登录,现在打开密码登录

通过网页远程链接 切换用户 sudo -i 输入vim /etc/ssh/sshd_config 进入配置文件 找到 将这一项设置为yes 重启系统 systemctl restart sshd.service

vivo X100s发布,搭载最新天玑9300+平台

在沉寂了半年后&#xff0c;vivo终于发布了新的旗舰产品。相较于前代的X100&#xff0c;X100s作为小迭代也有不少让人眼前一亮的地方&#xff0c;下面就让我们一同来了解下吧。 外观方面&#xff0c;虽然vivo X100s相较于X100没有大改&#xff0c;但却十分具有质感。以“青云”…

路径优化算法 | 基于遗传算法求解多式联运运输问题

内容 多式联运运输问题是一个复杂的组合优化问题,其中涉及到多种不同的运输方式和路径选择。遗传算法是一种常用的启发式优化算法,可以用于求解这类问题。 下面是基于遗传算法求解多式联运运输问题的一般步骤: 确定问题的数学模型:将多式联运运输问题转化为数学模型,包…

每周一算法:恰好经过K条边的最短路

题目描述 牛站 给定一张由 M M M 条边构成的无向图&#xff0c;点的编号为 1 ∼ 1000 1\sim 1000 1∼1000 之间的整数。 求从起点 S S S 到终点 E E E 恰好经过 K K K 条边&#xff08;可以重复经过&#xff09;的最短路。 注意: 数据保证一定有解。 输入格式 第 1 …

[牛客网]——C语言刷题day3

答案&#xff1a;A 解析&#xff1a; A.表示将数组a的首地址赋值给指针变量p B.将一个int型变量直接赋值给一个int型的指针是不行的 C.道理同B D.j2是一个右值&#xff0c;右值是不能进行取地址操作的 #include <iostream> using namespace std;#define N 7 int fun…

前端基础知识-ES6扩展运算符(快速实现数组添加新元素、字符串转为数组、对象添加新属性)

前言&#xff1a; 扩展运算符又称为Rest运算符&#xff0c;可以实现数组、对象、字符串在语法层面上的展开&#xff0c;达到简化语法的目的&#xff0c;使得我们提高开发效率 主要用法&#xff1a; 在需要解构的变量前加三个点&#xff08;...xxx&#xff09; 具体示例&…

Spring整合Junit(单元测试)

在软件开发过程中&#xff0c;单元测试是保证代码质量和功能完整性的重要手段之一。Spring框架提供了便捷的方式来管理和执行单元测试&#xff0c;并且与JUnit框架的整合非常简单。本文将介绍如何在Spring应用程序中整合JUnit进行单元测试&#xff0c;并提供一个简单的示例来演…

快速查看字符对应的ASCII码

1、借助gdb查看 打印字符串用双引号括起来打印单个字符用单引号括起来x 表示十六机制d 表示十进制t 表示二进制 2、借助二进制查看软件 第一步&#xff1a;把要查看的字符保存到文本文件中第二步&#xff1a;借助二进制查看工具&#xff08;比如&#xff1a;Hex Editor Neo&am…

【原创】尽量使用标准 json 格式替换 jsonl 以避免 datasets 包引入数据时处理报错

文章目录 问题发现问题解决问题回看 问题发现 使用 LLaMA-Factory 以 ORPO 方式训练模型&#xff0c;数据集习惯性按照 jsonl 的格式组织。 突然在读取数据阶段报错&#xff0c;且是很少见的 TypeError。对照官方模板没发现问题出在哪&#xff0c;又从内容层面做了初步排除&am…

网络安全护网行动:形式主义还是真有价值?

中国每年都投入大量人力物力进行护网行动&#xff0c;如网络攻防演练、黑客技术研究等。有人质疑这些行动是否只是形式主义&#xff0c;缺乏真正的价值。然而&#xff0c;本文将深入解释这些护网行动的原因&#xff0c;并阐明其对信息安全发展的真实价值。 网络信息安全问题的…

自养号测评实战指南:Shopee、Lazada销量翻倍不再是难题

对于速卖通、亚马逊、eBay、敦煌网、SHEIN、Lazada、虾皮等平台的卖家而言&#xff0c;提高店铺流量并转化为实际销量是共同追求的目标。在这个过程中&#xff0c;自养号进行产品测评显得尤为重要。通过精心策划和执行的测评活动&#xff0c;卖家不仅能够显著增加产品的销量&am…

Google Chrome 设备工具栏原理

1.不同预览模式 2.计算出缩放比 3.固定滚动偏移 关键代码&#xff1a; overview&#xff1a; ratioW getChildRect().width / getParentRect().width ratioH getChildRect().height / getParentRect().height maxRatio max(ratioW, ratioH) if(maxRatio < 1) return 1 …

生产车间PDA应用的规划

作为IT经理,在规划生产车间的PDA应用时,需要考虑的IT基础设施方面的前提条件。以下是一些关键的考虑因素,包括要点、实例和参考数据: 01、Infra 的前提条件 1. **网络基础设施**: - **无线覆盖**:确保车间有全面的无线信号覆盖,比如使用Wi-Fi 6技术,提供至少1Gbps的…

GPRS与4G网络的技术差异与应用选择

在移动通信的发展历程中&#xff0c;GPRS&#xff08;General Packet Radio Service&#xff09;和4G&#xff08;Fourth-Generation&#xff09;技术都扮演着举足轻重的角色。虽然两者都旨在提供无线数据传输服务&#xff0c;但在数据传输速率、延迟和覆盖范围等方面&#xff…

计算机网络实验3:路由器安全防控配置

实验目的和要求 理解标准IP访问控制列表的原理及功能理解CHAP、DHCP配置原理了解家用式无线路由配置方法实验项目内容 标准IP访问控制列表配置 CHAP验证路由器上配置DHCP网络地址转换NAT配置无线路由实现实验环境 1. 硬件&#xff1a;PC机&#xff1b; 2. 软件&#xff1a;W…

spark自定义函数实现

场景:由于系统函数无法满足实际开发需求,需要通过自定义函数来实现 示例: package sparkimport org.apache.spark.sql.{Row, SparkSession} import org.apache.spark.sql.expressions.{MutableAggregationBuffer, UserDefinedAggregateFunction} import org.apache.spark.sql.…