【李巍(noslopforever·天堂里的死神)原作,转载请注明出处】
本Blog原来那篇《智能指针三兄弟》:
http://blog.csdn.net/noslopforever/archive/2006/12/19/1449569.aspx
,在智能指针的使用上,使用了侵入式的设计。欲使用智能指针,则必须为每个使用智能指针的类生成一个static的INVALID对象。如果是自己写一个库自己用那大凡没有问题,但如果用在别人的库上,这就吃亏了。
INVLALID对象的主要作用是:在解引用(*),指向(->)等操作发生的时候,当智能指针发现自己所接管的指针是一个NULL,就会把指针重定位到INVALID对象上去。以防用户既不写try(比如像我这样的“异常无视流”的坚定支持者: P。题外话,如果要是一个try的坚定支持者的话,那么Boost的智能指针库就很好用了,剩下的内容您就不用看了 ^_^ ),又不判断指针合法与否而导致程序挂掉。现在不让你挂了,只是满天遍地给你报日志,告诉你引用了某某某非法对象。
对于一个抽象或者非抽象类,INVALID类往往应从它们派生,并删除其主要操作函数的实现,转而仅输出Log后就返回错误值。如果您对用户的C++功底放心,那么也可以选择throw一个异常,这对这些用户也是一个好处——异常多了他们自己就记住该怎么去try catch了。助人为乐,帮人学习,此乃功德无量,功德无量……(众人:扔砖!)
INVALID类和对象应有如下特征:
INVALID对象有且仅有一个,且应以实例方式创建自INVALID类。因为INVALID对象多了也没用,一个就够了。
INVALID类的AddRef和Release方法应该架空。在这套体系下,用户很可能会继续无视指针是否合法(因为现在不合法已经不会让他们的程序挂掉了),因此更可能会误调用INVALID对象的Release和Addref。Addref还好,但Release在很多人写起来往往就是if(--ref == 0) delete this;这种情况自然导致对一个唯一的、在桟上创建(而不是在堆上创建)、而且还到处被引用的对象的delete操作,接下来的结果——上帝对我说:“那就不是你我能知道的了”……
重新说一下INVALID,下面开始本帖想说的主题:
昨天散步的时候想到,关于类和INVALID类,是一一对应的,其实可以把他看作一个类和一个INVALID类组成了一个Pair,这意味着什么呢?如何在编译期实现Pair,你想起来了么?
传说中的Traits!
(下面的代码按照记忆所写,可能语法过不去……)
template<typename T>
struct InvalidClassTraits {
typedef void NULL_CLASS;
};
这里,void的原因很简单,void是一个非常特殊的类型,这个类型无法在堆和桟上进行实例化。
而如果我们要建立一个Pair,就这么写:
template<> struct InvalidClassTraits<ClassA>
{typedefNull_ClassA NULL_CLASS} ;
这里,ClassA和Null_ClassA是原始类和INVALID类。
用的时候怎么用呢?
下面:
template<typename T>
struct _Invalid {
typedef T ValueType;
static ValueType* ReturnInvalid()
{
static InvalidClassTraits<T>::NULL_CLASS NullObj; // 注意这一句
return &NullObj;
}
};
这就满足了我们return一个INVALID对象指针的要求了,而且这个INVALID对象,来自于桟,而且唯一。
原来代码里 return T::INVALID;现在就应该换成:return _Invalid<T>::ReturnInvalid();了。
放到工程里,现在的做法是:
.h里:
class A{
virtual void do() = 0;
};
class A_NULL{
void do();
};
template<> struct InvalidClassTraits<A>{typedefA_NULL NULL_CLASS} ;
cpp里:
void A_NULL::do()
{
//throw; or log ; or other ...
}
即可。
用户使用智能指针还是原来的样子:TSharePtr<A> ptrA = ......
不过注意,所有对这个智能指针的使用必须在顺序上后于
template<> struct InvalidClassTraits<A>{typedefA_NULL NULL_CLASS} ;
这句声明,否则会导致无法链接的错误。
就写到这里了。欢迎大家拍砖扔丢。理不辨不明,呵呵。
另外,原创文章,允许转载,转载请注明作者和出处:
李巍(noslopforever·天堂里的死神)
http://blog.csdn.net/noslopforever
分享到:
相关推荐
非侵入式负荷监测技术是一门新兴的技术,它用于监测和分析用电设备在运行中的电力消耗情况,而无需直接接触设备本身。非侵入式负荷监测的应用范围很广,包括家用电器、工业设备以及电网的负载分析等。 在非侵入式...
为了适应这一需求,"基于云平台的非侵入式负荷监测与识别系统"应运而生,该系统的技术创新和应用前景极具潜力。 首先,让我们来深入探讨一下非侵入式负荷监测与识别系统的设计初衷和工作原理。传统上,电力消耗的...
非侵入式负荷分解代码。。 简单版实现。只是让大家看懂。并理解什么是电力负荷分解。非侵入式电力负荷监测,简单来说,就是通过家庭入口处(就是电表)的各项特征(就是有功,电流,电压什么的),用各种算法来得到...
非侵入式负荷分解(Non-Intrusive Load Monitoring,NILM)是一种先进的能源监测技术,它允许通过单一的电表来识别和分析各个家用电器的能耗情况,无需在每个设备上安装单独的传感器。NILM的目标是提高能源效率,...
本文非侵入式负荷识别,提取特征,通过神经网络模式识别,混沌矩阵,遗传算法有效地识别出用电设别
非侵入式负荷监测与分解研究综述非侵入式负荷监测与分解研究综述非侵入式负荷监测与分解研究综述非侵入式负荷监测与分解研究综述非侵入式负荷监测与分解研究综述
非侵入式负载监控(NILM)是一种技术,它允许我们监测家庭或建筑物中的电力消耗,而无需在每个电器上安装单独的传感器。这主要通过分析总的电表读数来实现,通过分解总能耗来识别各个设备的功率使用情况。在“用于非...
非侵入式居民负荷辨识(Non-Intrusive Load Monitoring,NILM)是电力系统领域的一个重要研究方向,它旨在通过监测整个家庭的总用电量,来识别各个独立电器的功率消耗情况,无需在每个电器上安装单独的传感器。...
标题中的“%E7%94%A8%E7%94%B5%E6%A3%80%E6%B5%8B.zip_非侵入_非侵入式”翻译成中文是“用电检测.zip_非侵入_非侵入式”,这表明这个压缩包可能包含的是一套关于非侵入式电能监测的技术或应用。非侵入式技术在电能...
《基于低维算子机器学习逼近的非侵入式非线性模型降阶》 在当前的科研与工程领域,高维度的动态系统模拟已成为常态,但随之而来的是计算复杂度的急剧增加,使得参数化非线性动态系统的实时分析、设计优化以及控制...
kernel.css 是一个非侵入性的语义化CSS和JavaScript框架,旨在提高网页开发的效率和可维护性。这个框架的核心理念是将样式和行为分离,同时保持代码的清晰和易于理解,这对于大型项目的开发尤其重要。 在CSS方面,...
阿里非侵入式热修复方案SophixDemo是一个创新的技术实践,旨在解决移动应用在发布后出现bug时,无需用户下载新版本即可实现问题修复的问题。Sophix是阿里巴巴开源的、针对Android平台的热修复框架,它允许开发者在不...
标题中的“Btrace非侵入式调试Java程序神奇linux版”指出,这是一个专为Linux系统设计的工具,名为Btrace,它主要用于非侵入式的Java程序调试。非侵入式意味着Btrace可以在不修改或重新编译原始Java代码的情况下,对...
这种识别通常分为非侵入式负载识别(NILM)和侵入式负载识别。由于非侵入式负载识别技术在智能家居中的应用越来越广泛,其经济效益较高且易于部署,因此受到了广泛的关注。NILM技术可以准确地识别用户的电器使用情况...
首先,非侵入式监控意味着这种工具不会改变或影响原有的代码逻辑。它通过在运行时动态插入跟踪代码,收集应用程序的运行数据,如执行时间、内存消耗、数据库查询等。这种方式对开发者来说是透明的,无需修改代码,...
"扁平简单和非侵入的颜色选择器"是一款专为JavaScript开发设计的高效工具,它提供了颜色操作的功能。这款颜色选择器的特点在于其简洁的设计、轻量级的代码以及高度的可定制性,使得它在各种项目中都能无缝集成。 ...