泛化的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等高级机制,并探讨了如何利用这些特性解决实际工程问题,例如通过编译期计算优化性能,以及使用类型萃取实现更灵活的代码设计。 阅读详情

相关推荐

虚幻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::ScopeGuard)

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

purewinter的专栏 2971

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

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

weixin_34056162的博客 544

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/

DaVinci Configurator实战:从DBC导入到通信栈配置全解析

本文详细解析了如何使用Vector DaVinci Configurator工具,从导入行业标准DBC文件开始,高效完成AutoSAR通信栈(包括COM、PduR、CanIf等模块)的自动化与精细化配置。文章通过实战步骤,重点阐述了DBC导入、与EB MCAL协同、核心模块参数调整及诊断标定服务集成等关键环节,旨在帮助汽车电子工程师快速掌握这一核心工具,提升开发效率与准确性。

weixin_29159127的博客 593

用ScopeGuard简化异常安全代码

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

meteor1113的专栏 1792

标签传播算法LPA:半监督学习解决标注数据不足的完整实战指南

在机器学习实际工程中,标注数据稀缺往往是制约模型性能的核心瓶颈。半监督学习提供了一条利用海量未标注数据来增强模型泛化能力的有效路径,其中标签传播算法(Label Propagation Algorithm, LPA)因其直观的图结构和优雅的数学原理而备受关注。LPA通过将样本映射为图中的节点,以相似度作为边权重,让已知标签沿着图结构不断扩散,从而实现对未知样本的预测。其背后基于聚类假设与流形假设,能在低标注率场景下显著缓解过拟合问题,提升分类准确率。该技术在文本分类、金融风控、图像识别等存在大量无标注数据的

weixin_29056781的博客 241

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

基于大模型的脑疝全流程预测与诊疗方案研究

目录一、引言1.1 研究背景与目的1.2 研究意义1.3 大模型技术概述二、脑疝概述2.1 定义与分类2.2 发病机制与病因2.3 临床表现2.4 诊断方法三、大模型在脑疝预测中的应用3.1 数据采集与预处理3.2 模型训练与选择3.3 模型验证与优化四、术前预测与评估4.1 病情严重程度预测4.2 手术风险预测4.3 个性化手术方案制定4.4 麻醉方案制定五、术中监测与决策5.1 实时监测指标5.2 大模型辅助决策5.3 应对突发情况六、术后评估与护理6.1 术后恢复情况评估6.2 并发症风险预测与预防6

嵌入式毕设/课设资料清单(速查手册·文档模板·题库,持续更新)→ 见最新文章 1286

2024最新指南:如何用Python批量下载Sentinel-2数据(附避坑清单)

本文提供2024年最新Python批量下载Sentinel-2遥感数据的完整指南,涵盖环境配置、API准备、核心下载流程实现及实战避坑清单。通过智能查询器、断点续传下载器等实用工具,帮助用户高效获取遥感数据,避免常见网络问题和数据完整性验证失败。

silver的专栏 619

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

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

Fluence_YHL 364

SAP 移动类型简述

SAP系统中用于标志物料移动(收货/发货/转储/转储记帐)的三位的数字/字母 通常分几大类:收货 发货 转储 库房调整 常用的有: 收货类 (MB1C) 101 采购订单收货 103 采购订单收货至冻结状态 122 无采购订单退货 161 按退货采购订单退货 131 从生产订单 501 无采购订单收货 511 免费收货 发货类(MB1A) 201 成本中心消耗

forever_crazy的专栏 7203

ScopeGuard

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

606

Android 14.0 首次开机默认授予app运行时权限(去掉运行时授权弹窗)

在14.0的系统rom产品定制化开发中,在6.0以后对于权限的申请,都需要动态申请,所以会在系统首次启动后,在app的首次运行时, 会弹出授权窗口,会让用户手动授予app运行时权限,在由于系统产品开发需要要求默认授予app运行时权限,不需要用户默认授予运行时弹窗,所以需要在首次开机默认授予所有app运行时权限

安卓兼职framework和app工程师的博客 2531

数据治理——详解元数据、资源目录、主数据、数据元、元数据管理、主数据管理【附全文阅读】

摘要:数据中心建设的核心是元数据管理,即"描述数据的数据",包含内容、质量、所有者等关键信息。元数据在数据仓库中记录数据源、转换规则等,是管理基础;主数据管理则确保核心业务数据的准确一致。二者共同构建高效的数据资源目录,为数据服务提供支撑。(99字)

cdfunlove的博客 102

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

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

weixin_33829657的博客 344

支付宝h5参数如何实现跳转?(包含相关Demo代码)

🏆本文收录于专栏,主要记录项目实战过程中所遇到的Bug或因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家!持续更新中,up!up!up!!

**My Coding Family** 3250

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

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

freehawkzk的专栏 2497

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

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

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

ptrunner的专栏 1203

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

一个人的战争 (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、付费专栏及课程。

余额充值