华为mate10和荣耀10哪个好9和荣耀9哪个好?

2042人阅读
modern c++ design(13)
今天终于看完了Modern C++ Design. 从第一天看时候的激动不已, 到如今看完之后, 长出一口气。 这本书的确是想搞懂C++的一本必读之物。 模板,模板特化,模板元编程是贯穿整本书的技术灵魂, 多继承是实现policy的手段, 并利用编译器编程实现了泛化的模式。
第一篇:技术policy的设计概念激动人心, 确实是一种全新的策略, 类似于多态,strategy模式, 却在编译期完成选择。 模板偏特化, 很清楚的介绍了模板偏特化的方方面面,type_info, 运行时类型信息, 并可用作类型排序,局部类, 类型映射, 很多少见的C++技术。 typelist, 通过typelist这样一个递归定义的实现, 阐述了模板元编程的奥秘, 确实如序中所说, 本章非常精彩。 看过这三章, 可以说是, 在平时的思考中,又有了一个新的空间, 一个新的选择, 虽然一下掌握这些技术不太现实, 不过这种思考方式却很令人兴奋。第四章的小型对象分配,是一种内存分配技术, 没有搞过, 也不是什么新技术, 感觉一般了。 不过如果需要做一个自己的分配器,这章是个利器。第二篇:组件泛化仿函数, 详尽的介绍了仿函数的问题, 并提供了一个手段, 将各种实现了()的东西, 封装为仿函数, 要做泛型编程, 这章尤为重要, 以后还需再多读几次。smart points 详细解释了智能指针的各种问题, 并加以实现。 智能指针用的少,感觉不大。&singleton, Object Factories, Abstract Factory, Vistor, Multimethods. 运用前述的各种技术, 将这些组件抽丝剥茧, 分为几类策略, 可以轻松定制, 并将很多烦杂的工作泛型自动化, 体现了作者的实力。 看看容易, 理解其中的深度, 需要时间和经验了, 相信没有经历过作者描述的那些问题, 是不能明白设计的意义的。
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:48601次
排名:千里之外
原创:38篇
(2)(5)(31)Template 是一种很适合组合各种行为的机制,主要是因为他们依赖使用者提供的型别信息并且在编译起才产生的代码
和一般的clas不同,class templates可以以不同的方式定制,如果想要针对特定的情况来设计class,你可以在你的class template中特化其成员函数来因应。
对于带有多个参数的class template,你可以采用partial template speciallization。他可以让你根据部分参数来特化一个class template。
template的编译期特性以及可互相组合特性,使得它在设计期非常引人注目,然而一旦你开会开始尝试做这些设计,你会遭遇一些不是那么浅白的问题:
1.你无法特化结构,单单使用templates,你无法特化class结构,你只能特化其成员函数
2.成员函数的特化并不能依里扩张,你可以对单一template参数的class templateTeha特化其成员函数,却无法对着多个template参数的class template特化其个别成员数。
3。程序库撰写者不能提供多个缺省值,理想情况下class template的作者可以对每个成员函数提供一个缺省实作品,却不能对同一个成员函数提供多个缺省实作品。
现在让我们比较一下多重继承和template之间的缺点,又去的是两者互补,多重继承欠缺的技术,template有丰富的技术,多重继承缺乏心别信息,而拿东西在template里大量存在。template的特化无法扩张,多重继承却很容易扩张,你只能为template成员函数写一份缺省版本,但你可以写数量无数的base class
根据以下分析,如果我们将template和多重继承组合起来,将会产生非常具有弹性的设计,应该社和用来产生程序库中的设计元素
Policies 和policies classes
所谓policies,乃是用来定义一个class或者class template的接口,该接口由下列项目之一或者全部组成:
内隐型别、成员函数和成员变量。
Policies也被其他人用于traits,不同的是后者比较重视行为而非型别。
这里有一个重要概念,Policies接口和一般传统的classses接口(纯虚函数集)不同,他比较松散。因为Policies是语法导向而非标记导向。换句话说,createor明确定义的是怎么样的语法构造符合其规范的class,而非必须室作出那些函数。例如,creator Policy 并没有规范create()必须是static还是virtual,他只要求class必须定义出create(),此外,creator也只规定create()应该传回一个指向新对象的指针。一维create()也许会传回0或者丢出异常。
面向一个policy,你可以作出数个policy classes。他们全部都必须遵守policy所定义的接口。
现在让我们看看如何设计一个class得以利用creator policy,它以复合或者继承的方式使用先前定义的三个classes之一,例如
template&class CreationPolicy&
class WidgetManager:public CreationPolicy
如果class采用一个或者多个Policies,我们称其为hosts或host classes。上例的widgetManager辨识采用了一个policy的hostclass。hosts负责把Policies提供的结构和行为组成一个更复杂的结构和行为。
当客户端将widgetmanager tmeplate 具象化时,必须传进一个他所期望的policy
typedef WidgetManager&OpNewCreator&Widget& & MyWidgetM无论何时,当一个MyWidgetMgr对象要产生一个Widget对象时,他便调用它的policy对象OpNewCreator&Widget&所提供的create()。选择生成策略widget使用者的权利。皆借组这样的设计,可以让widgetManager使用者自行装配他所需要的机能。
这便是policy-based class设计的主旨。
运用template template 参数实作policy classes
如同先前的例子所示,policy的template引数往往是多余的,使用着每次需要传入template引数给OpNewCreator,这很笨拙,一般来说,host class 已经知道policy class 所需参数,或是轻易便可推导出来,上述例子中widgetManager总是操作widget对象,这种情况下还要求使用者把widget型别传给OpnewCreator,就显得多余且危险。
#include&iostream&
#include&vector&
#include&list&
class SliderWidget
SliderWidget();
std::cout&&"Slider Widget created"&&std::
class BoxWidget
BoxWidget()
std::cout&&"Box Widget created"&&std::
template &class T&
class OpNewCreator{
static T* create()
return new T;
protected:
~OpNewCreator(){}
template &class T&
class MallocCreator
static T* create()
void *buf=std::malloc(sizeof(T));
if(!buf) return 0;
return new(buf) T;
protected:
~MallocCreator(){}
template &class T&
class PrototypeCreator
PrototypeCreator(T * pObj=0):pPrototype(pObj)
T* create()
return pPrototype?pPrototype-&clone():0;
T* getPrototype(){return pP}
void setPrototype(T* pObj){pPrototype=pO}
protected:
~PrototypeCreator(){}
template&class T&
class ContainerVec
void push(T* widget)
mVecContainer.push_back(widget);
~ContainerVec(){}
std::vector&T*& mVecC
template&class T&
class COntainerList
void push(T* widget)
mListContainer.insert(widget);
~containerList(){}
std::list&T*& mListC
template&class T,
template&class& class CreationPolicy=MallocCreator,
template&class& class Container=ContainerVec
class WidgetManager:public CreationPolicy&T&
typedef CreationPolicy&T& BaseC
T* create()
T* tmp=BaseClass::create();
mContainer.push_back(tmp);
Container&T& mC
typedef WidgetManager&BoxWidget,OpNewCreator,ContainerVec& BoxWidgetM
typedef WidgetManager&SliderWidget,OpNewCreator,ContainerList& SliderWidgetM
int main()
BoxWidgetManager boxWidgetM
BoxWidget* boxWidet=boxWidgetManager.create();
cout&&typeid(BoxWidgetManager).name()&&
system("pause");
阅读(...) 评论()2216人阅读
VC/MFC(9)
c++Modern C++ Design(C++--C++
struct POINT
&&& int X;
&&& int Y;
&&& POINT(int x=0,int y=0)
&&&&&& X =
&&&&&& Y =
&&& POINT(POINT& pt)
&&&&&& X = pt.X;
&&&&&& Y = pt.Y;
&&& POINT * Clone()
&&& &&& POINT* pt = new POINT();
&&& &&& return
&&& void Print()
&&& &&& printf("point :%d,%d/n",X,Y);
这个没什么好说的,下面再看我们要重点谈的类,假如我有几种需求,需要构建与一个我自已的MyPoint对象,但它可能是基于多种结构的的POINT,嗯比如一种是二维平面的,如上面的类,也可能是三维空间的POINT3D,噢或者是我暂时无法理解的多维空间的点,但是它们的在MyPoint里的表现形为是一样的,那么我是不是要写多个MyPoint对象呢?没有必要,我们有模板,很容易的我们会想到写出下面的代码来
template&typename T&
struct MyPoint
&&& MyPoint()
&&&&&& pt =& new T();
&&& ~MyPoint()
&&& &&& if(pt)
&&&&&& &&& delete
&&& void Do()
&&&&&&& pt-&Do(...);
嗯,运行没有问题,我想大部分的筒子都会是这样写,我以前也是这样来写。只是有个小问题,效率不太高。仔细分析一下,我们会知道这段代码有三重问题,A)构建MyPoint需要两个new,一个是系统来构建MyPoint,一是由你自已的代码来new的POINT对象;B)需要一个指针来指向POINT对象,虽然它只有四个字节,但是考虑到一个平面有无穷多个点,这个开销是没有必要的;C)最严重的问题,需要维护这个指针。
有没有办法解决这几个问题呢,我们想到用继承,可以这样写
struct MyPoint : public POINT
&&& void Print()
&&& &&& POINT::Print();
噢噢,我们还得写一个MyPoint3D,MyPoint4D,...,MyPointND!
不错继承解决了我们问题但我们仍回到了最初,那么模板能不能给我们带来什么?
看看这个写法
template&typename T&
struct MyPoint : public T
&&& void Print()
&&& &&& T::Print();
强悍!我们的问题解决了,而且没有带来任何负担,以效率为第一生命的C++竟然可以这样来写,
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:211823次
积分:3018
积分:3018
排名:第10736名
原创:63篇
评论:172条
(1)(1)(1)(2)(2)(1)(1)(3)(1)(1)(1)(2)(4)(2)(1)(2)(3)(1)(2)(2)(3)(13)(7)(1)(1)(2)(2)1097人阅读
Loki(51)
&&& 论断事务不由本质,尽好口舌之辩的人,不足取也。&&& Andrei站在远比我高得太多的山巅上,不当的言语和文字并不能为我堆砌楼台使与同高。侯老师如是说,让我这个初学者在Modern C++ Design这本书的学习过程中,不敢多言片语。每每提笔却又放下。&&& 我是一个心急还想吃热豆腐的人,每得好书,常夜不寐,求看完。&&& 一般的书,不会杀死我太多的睡眠时间,但是Modern C++ Desing不同,我用了最短的时间把它看完,却发现它是精神鸦片,你了解的越多,你想知道的越多,似乎它杀死我睡眠时间的行为还会继续下去,看不到个尽头。出于对自己负责,我想说,Modern C++ Design是一本非常差的书。&&& 大凡你熟悉的东西,接受起来就比较容易,所以大凡你可以用不多的时间很心安的说自己已经看完了一本书,那这本书对你的帮助或许不多。如果某本书你看的每一个章节都很吃力,那通过这本书你多半可以学到很多,对于我来说,Modern C++ Design确实是这样一本书。&&& 的确,我对模板的理解就是认为它是一个戴着帽子的朋友的层次,初看Modern C++ Design让我很害怕,如此伟大的想法我竟然全无所知,而且它已经被提出好些年了。学习然后使用,然后再学习,总有心得,一直想或多或少写点,却又怕被人笑话基础的东西都不会还在这里拿一些未必正确的理解做秀。&&& 今夜,当我再一次端起这本书依然无眠的时候,我想,我该写点东西了,不然,心总不安,觉得自己没有用心看过这本书,觉得自己亵渎了技术。&
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:172842次
积分:2836
积分:2836
排名:第11697名
原创:113篇
评论:28条
(3)(5)(26)(3)(2)(3)(4)(35)(32)(3)资料评价:
所需积分:2

我要回帖

更多关于 华为mate10和荣耀10哪个好 的文章

 

随机推荐