泛化的ScopeGuard模板类

Flutter与鸿蒙原生代码集成实战:native_toolchain_c适配指南 跨平台开发中,原生代码集成是提升应用性能的关键技术。通过Dart FFI机制,Flutter应用可以调用C/C++编写的原生模块,实现计算密集型任务的高效执行。native_toolchain_c作为Flutter生态的重要工具链组件,解决了多平台构建差异性问题,特别在鸿蒙系统适配中展现出独特价值。该工具自动化处理交叉编译、符号导出等底层细节,使开发者能专注于业务逻辑实现。在图像处理、音视频编解码等场景下,结合鸿蒙的HiCache优化机制,可获得较Android平台15-20%的性能提升。本文详解从环境配置 阅读详情

 

#pragma once

#include 
<cassert>
#include 
<memory>
#include 
"non_copy_able.h"



class ScopeGuardImp : private NonCopyable
{
public:
        ScopeGuardImp() 
{ };
        
virtual ~ScopeGuardImp(){ }
}
;



template
<class Type, class Fore, class Aft>                    
class ScopeGuardMF : public ScopeGuardImp
{ 
private:
        typedef typename 
void (Type::*MFun)(void);
private:
        Type    
*m_type;
        Fore    m_fore;
        Aft        m_aft;
public:
        ScopeGuardMF(Type 
*ptype, Fore fore, Aft aft)
        
{
                assert(ptype 
!= NULL);
                m_type 
= ptype;
                m_fore 
= fore;
                m_aft 
= aft;
                (m_type
->*m_fore)();
        }


        
~ScopeGuardMF()
        
{
                (m_type
->*m_aft)();
        }

}
;


template
<class Fore, class Aft>
class ScopeGuardFun : public ScopeGuardImp
{ 
private:
        Fore    m_fore;
        Aft        m_aft;
public:
        ScopeGuardFun(Fore fore, Aft aft)
        
{
                m_fore 
= fore;
                m_aft 
= aft;
                m_fore();
        }

        
        
~ScopeGuardFun()
        
{
                m_aft();
        }


}
;


class ScopeGuard  : private NonCopyable
{
private:
        std::auto_ptr
<ScopeGuardImp>   m_pimp;
public:
        template
<typename Type, typename Fore, typename Aft>
        ScopeGuard(Type 
*ptype, Fore fore, Aft aft)
        
{
                m_pimp.reset(
new ScopeGuardMF<Type, Fore, Aft>(ptype, fore, aft));
        }

        
        template
<typename Fore, typename Aft>
        ScopeGuard(Fore fore, Aft aft)
        
{
                m_pimp.reset(
new ScopeGuardFun<Fore, Aft>(fore, aft));
        }


        
~ScopeGuard() { }

}
;



 

测试代码:

 



class Test
{
public:
        
int fore() { printf("fore ");  return 8;}
        
void after() { printf("after "); }
}
;

void fore() { printf("aaaaa "); }
double after() { printf("bbbbb "); return 33.6;}

int main()
{
        
{
                Test test;
                ScopeGuard guard1(
&test, &Test::fore, &Test::after);
        }

        
{
                ScopeGuard guard2(fore, after);
        }

        
        
        cin.
get();

        
return 0;
}
;
C++模板实战指南:从泛型编程到编译期计算的工程应用 泛型编程是现代软件开发中的核心范式,它通过参数化类型实现了代码的高度复用。其原理是在编译期进行类型推导和代码生成,从而在保证类型安全的同时避免了运行时开销。这种技术价值在于能够构建通用、高性能的库和组件,广泛应用于容器、算法库以及性能敏感的系统开发中。通过模板元编程,开发者甚至可以将计算任务转移到编译期,实现零成本抽象。本文聚焦于C++模板的实战应用,深入解析了模板特化、SFINAE等高级机制,并探讨了如何利用这些特性解决实际工程问题,例如通过编译期计算优化性能,以及使用类型萃取实现更灵活的代码设计。 阅读详情

相关推荐

RK3588平台SDIO WiFi模组调试全流程:从设备树到网络连通

嵌入式Linux开发中,SDIO接口WiFi模组的驱动移植与调试是连接硬件与网络的关键环节。其原理涉及SDIO总线枚举、设备树硬件描述、电源时序控制、固件加载及网络协议栈协同。技术价值在于实现稳定无线连接,支撑边缘计算、工业网关等场景的数据回传与远程运维。应用场景包括智能NVR、无线图传等。本文以RK3588与aic8800模组为例,完整覆盖硬件确认、设备树配置、驱动编译、固件加载及网络验证,提供可复用的调试路径与排查经验。

weixin_34056162的博客 544

永久改变你写异常安全代码的方式(神奇的Loki::ScopeGuard)

 作者:Andrei Alexandrescu and Petru Marginean原文地址:http://www.ddj.com/cpp/184403758翻译,裁剪,修改:purewinter注:裁剪修改只是为了让更多csdn上的读者不会因为此文太长而放弃阅读。。。注2:Loki::ScopeGuard不仅对通常意义的异常有用,对于所有可以使用RAII的地方均有用。包括new

purewinter的专栏 2971

虚幻4 SCOPE_CYCLE_COUNTER

QUICK_SCOPE_CYCLE_COUNTER(STAT_FForwardShadingSceneRenderer_Render); 展开: 第一步: #define QUICK_SCOPE_CYCLE_COUNTER(Stat) \ SCOPE_CYCLE_COUNTER_GUARD \ DECLARE_SCOPE_CYCLE_COUNTER(TEXT(#Stat),Stat,ST

虚幻4引擎工作室 4928

Loki 库学习(1)ScopeGuard

ScopeGuard 主要分两种情况: 1. 调用非成员函数 2. 调用成员函数 含一个参数,非成员函数 的 ScopeGuard 模板: #include &lt;bits/stdc++.h&gt; #define rep( i , j , n ) for ( int i = int(j) ; i &lt; int(n) ; ++i ) #define dew( i , j , n )...

Fluence_YHL 630

Loki库源码(泛型模式C++库)

Loki is the name of a C++ software library written by Andrei Alexandrescu as part of his book Modern C++ Design.   The library makes extensive use of C++ template metaprogramming and implements several commonly used tools: typelist, functor, singleton, smart pointer, object factory, visitor and multimethods.   Originally the library was only compatible with two of the most standard conforming C++ compilers (CodeWarrior and Comeau C/C++): later efforts have made it usable with a wide array of compilers (including older Visual C++ 6.0, Borland C++ Builder 6.0, and GCC). Compiler vendors used Loki as a compatibility benchmark, further increasing the number of compliant compilers.   Maintenance and further development of Loki has been continued through an open-source community led by Peter Kümmel and Richard Sposato as a Sourceforge project.Ongoing contributions by many people have improved the overallrobustness and functionality of the library. Loki is not tied to thebook anymore as it already has a lot of new components (e.g. -StrongPtr, Printf, and Scopeguard). Loki inspired similar tools andfunctionality now also present in the [1][2]Boost library collection. [1] http://en.wikipedia.org/wiki/Loki_(C%2B%2B) [2] http://loki-lib.sourceforge.net/

sap 标准委外和工序委外_SAP PP 工序委外详解

在SAP里有外包和外协两种:外包:指把原材料发出去,扣减库存,然后供应商加工生产,最后再作为成品入库。主要是在MM模块下实现的。对应的英语叫Subcontracting。外协:一般是指某种工序外协,在工艺路线里设置某个工序为外协后,系统自动会产生一个采购订单,一般是指采购某种服务。采购回来后再继续本公司的其他工序。主要是在PP模块下实现的。对应的英语叫Processing。2.当有委外加工的业务流...

weixin_26849971的博客 4579

用ScopeGuard简化异常安全代码

ScopeGuard是Loki库里的一个组件,用来在c++中进行局部资源管理。很多时候,在一个函数内部会有资源的申请和释放,如果在函数内部出现的异常,那么要完全释放资源是比较痛苦的,常见的作法是对所有可能产生异常的地方try...catch,不管是否有异常,申请的资源都是要释放的。但是这样的写法造成代码体积很大,而且很不易读。解决的方法是使用c++的RAII(资源申请即初始化),可以对

meteor1113的专栏 1792

逆变器技术解析:DDSRF双解耦在正负序分离中的关键作用

本文深入解析了DDSRF双解耦技术在逆变器正负序分离中的关键作用。通过建立正反旋转坐标系并利用交叉反馈解耦网络,DDSRF能快速、精准地分离电网电压中的正负序分量,从而显著提升锁相环在电网不平衡条件下的精度与系统稳定性,是现代高性能并网逆变器的核心算法之一。

m3n5b7v8c9x的博客 410

C++ 学习笔记(14)RAII 资源管理型模板化

对比 C++ RAII 泛化,进一步把资源封装在 RAII 中,向外提供接口 尚不完善,仅作记录用 #include &lt;bits/stdc++.h&gt; #define rep( i , j , n ) for ( int i = int(j) ; i &lt; int(n) ; ++i ) #define dew( i , j , n ) for ( int i = int(n-1...

Fluence_YHL 232

计量经济学——事件研究法/事件分析法

计量经济学——事件研究法/事件分析法

weixin_46189461的博客 6752

Cadence仿真数字电路功耗

Cadence仿真数字电路功耗 数字电路的功耗采用平均电流乘电源电压获得,所以本文的关键是测量平均电流。 仿真前设置好仿真参数后,在仿真的ADE街边选择:outputs➡to be saved➡select on design 选择电源的负端电流(若选择正端,则电流为负): 选择完成后,在ADE界面讲所选节点的plot也勾选上,点击run。仿真完成后自动显示波形。在波形上选中该电流曲线,右击选择:send to➡calculator 注意上图中,商店前的波形不稳定,需要进行截取。在calculator

qq_41519780的博客 1万+

C++ 学习笔记(13)RAII 模板化 和 ScopeFuard 模板化

巧妙运用 std::function&lt;&gt; 和 lambda 表达式,做到泛化 PS: 手动清理在异常安全和资源安全方面的缺点:手动调的一个坏处是,如果在资源申请和释放之间发生了异常,那么释放将不会发生,此外,手动释放需要在函数的所有出口处都去调释放函数,万一某天有人修改了代码,加了一处return,而在return之前忘了调释放函数,资源就泄露了。 RAII 模板 #inclu...

Fluence_YHL 364

7系列ZYNQ硬件调试:Vitis无法识别ARM DAP的排查与解决

本文针对7系列ZYNQ开发中Vitis无法识别ARM DAP的典型硬件调试问题,提供了系统性的排查与解决方案。文章深入剖析了问题本质,指出ARM DAP无法访问的核心原因在于PS部分的电源、时钟或复位等硬件基础条件未满足,并重点强调了PS参考时钟(如33.333MHz晶振)的完整性是关键排查点。通过从电源完整性、时钟与复位信号到JTAG连接与焊接的逐步硬件排查,并结合软件配置交叉验证,为开发者提供了清晰的故障定位思路与实战指南。

weixin_29280657的博客 626

(原创)用c++11实现简洁的ScopeGuard

  ScopeGuard的作用是确保资源面对异常时总能被成功释放,就算没有正常返回。惯用法让我们在构造函数里获取资源,当因为异常或者正常作用域结束,那么在析构函数里释放资源。总是能释放资源。如果没有异常抛出则正常结束,只是有异常发生或者没有正常退出时释放资源。关于ScopeGaurd的概念想多了解一点的童鞋点这里和这里。c#中的ScopeGuard比较简单,通过using初始化或者通过finall...

weixin_33829657的博客 344

【AI平台】n8n入门2:第一个工作流,调用本地大模型

n8n是一款开源的,专注于AI工作流构建,支持灵活的自定义与集成。就是可以把大模型和其他工具联合起来,这就厉害了。而且,免费功能又强大,目前很火,来研究一下。

正经教主是个热衷于正经学习分享的教主。 4531

长期换衣行人重识别(Long-Term Clothes-Changing Person Reid)数据集汇总

长期换衣行人重识别任务中目前常用的数据集总览目前换衣数据集的主要问题数据集换衣/总体情况集统计DeepChange(2021)LaST(2021)COCAS(2020)VC-Clothes(2020)LTCC(2020)PRCC(2019)Celebrities-reID(2019) 总览 在长期换衣行人重识别的任务当中,数据集的获取(尤其是对于学术环境下)是一个难点,主要的困难有以下几点: 采集大规模的数据集比较困难。 采集不同的衣服的数据集比较困难。 采集不同衣服不同角度的数据集比较困难。 目前也有

KingsMan666的博客 8380

使用C11特性,实现对象自动释放(RAll)的方式(ScopeGuard )

参考:https://www.cnblogs.com/chenny7/p/11990105.html RAII的本质内容是用对象代表资源,把管理资源的任务转化为管理对象的任务,将资源的获取和释放与对象的构造和析构对应起来,从而确保在对象的生存期内资源始终有效,对象销毁时资源必被释放。换句话说,拥有对象就等于拥有资源,对象存在则资源必定存在。由此可见,RAII惯用法是进行资源管理的有力武器。 ScopeGuard ScopeGuard 最大的用处也是释放资源。 比如分配内存,做某些操作,...

ptrunner的专栏 1203

SAP SD实战:用BADI_SLS_HEAD_SCR_CUS给销售订单VA01/VA02加自定义字段(附完整函数组代码)

本文详细解析了在SAP SD模块中如何利用BADI_SLS_HEAD_SCR_CUS实现销售订单(VA01/VA02)的屏幕增强,包括数据结构设计、函数组创建和BADI接口实现。通过实战案例和完整代码,帮助开发者掌握在SAPMV45A标准流程中添加自定义字段的关键技术,提升业务定制化能力。

weixin_27015733的博客 369

ScopeGuard

目前看到的  ScopeGuard的有个比较能用的上的地方就是,如果需要退出时执行某个操作,可以和方便的使用,而不需要用try finally。不管里面是否抛出异常,都会执行到我们必须执行的函数 实现也是利用了构造和析构函数,在构造函数中,将需要调用的函数地址传入,在析构时调用 class ScopeGuardImplBase     {         /// Copy-assi

605

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

【UE4源代码分析】-008 从GuardedMain函数开始游戏循环

【UE4源代码分析】-008 从GuardedMain函数开始游戏循环   在上一篇《【UE4源代码分析】-005 Editor的起点-Main函数》(https://blog.youkuaiyun.com/freehawkzk/article/details/80593687)中,我们知道UE4程序启动运行时是从WinMain函数开始,之后调用GuardedMain函数进行处理,待GuardedMain退...

freehawkzk的专栏 2497

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

一个人的战争 (1) : Bencoding格式解码

        自学C++一年有余,一直想自己开发个什么东西,终于在今年7月份决定写个BT的客户端吧,恩,说干就干,于是开始了这次痛苦的旅程,越深入到各个细节当中越觉得自己可能完不成这个东西了,故决定开始写Blog激励自己一下,也希望能把一个编程新手遇到的各种困难都记录下来,供他人借鉴,也便于自己日后的查寻. 我这人比较罗嗦,可能整个文档中间会夹杂一些个人感悟,期望哪位不幸读到的朋友谅解. 有对P

Solidus的专栏 1396

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

一个人的战争(2) : 成员函数与线程

         本来今天打算贴BT Client的Tracker Requester的代码的,可是整理的不太完善,因为里面牵扯到很多线程和IOCP的东西,所以我先把一部分自己封装的线程代码贴上来供各位读者评论       先看下我对Win32线程的最浅封装,       注意这个是声明在thrad/win32/data_type.h下的struct ThreadHandle   

Solidus的专栏 1186

一个人的战争(3) : 我眼中的异步与非阻塞

         最近在尝试封装个网络工具包,从Socket开始,希望全部自己动手并且能提供一个跨平台的接口,哈哈,新手的通病就是求大求全,不过有一点,就是学习一些现代操作系统共有的特性的时候,我认为站在多个差不多的平台的角度来看待同一个问题要比单一的观察一个OS提供的API要好的多.        闲话少说, 当我进行到WIN32的OVERLAPPED I/O和IOCP的时候突然发现我无法继

Solidus的专栏 1169

Exceptional C++ 读书笔记

Exceptional C++ 读书笔记 //内存管理的一部分来自于http://blog.youkuaiyun.com/kingofark/category/9109.aspx Item 1 Iterator:     (1): 注意当前迭代器是否有效,如果无效则解引用产生程序错误; (2):注意当前迭代器生命期,某些容器经过某些操作后将重新分配内部存储空间,则当前迭代器无效; (3) : 有效范围

Solidus的专栏 1101
上一篇: 一个人的战争(3) : 我眼中的异步与非阻塞
下一篇: 算法记录 : 基本排序
SolidusSnake
博客等级 码龄20年 1粉丝 14原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值