- 1、本文档共8页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
Boost源码剖析之:泛型指针类any之海纳百川
Boost源码剖析之:泛型指针类any之海纳百川
C++是强类型语言,所有强类型语言对型别的要求都是苛刻的,型别一有不合编译器就会抱怨说不能将某某型别转换为某某型别,当然如果在型别之间提供了转换操作符或是标准所允许的一定程度的隐式转换(如经过非explicit构造函数创建临时变量的隐式转换或是在int,long这些基本型别间的)又另当别论。总的说来,为了保持型别安全,C++有严厉的要求。然而有时候程序员可能有这样的需要:
int i;
iong j;
X x; //假设X为用户定义的类
any anyVal=i;
... //use anyVal as a int value
anyVal=j;
... //use anyVal as a long value
anyVal=x;
... //use anyVal as a long value
复制代码
考虑这样的一个“泛型指针类”该如何设计是很有趣的事情。1.它本身不能是模板类,因为如果它是模板,你必须为它的具现化提供模板参数。而事实上你并不想这样做。你想让同一个对象接受任意型别的数据。在上面的代码中这个对象是anyVal。然而,如果你必须为它提供模板参数,那么上面的代码看起来就会像这样:
anyint anyIntVal=i;
anylong anyLongVal=j;
...
复制代码
这显然已经丧失了anyVal的优势----以单个对象接受所有型别的数据。与其这样还不如直接写:
int anyIntVal=i;
int anyLongVal=j;
复制代码
所以,any不能是模板类。2.它必须提供某些有关它所保存的对象型别的信息。3. 它必须提供某种方法将它保存的数值“取出来”。事实上,Boost库已经提供了这样的类boost::any,下面我就为你讲述它的原理及构造。首先,any类里面一定要提供一个模板构造函数和模板operator=操作符。因为你必须允许用户写出:
any any_value(val); //val 的型别为任意的
any_value=val1; //val1 型别也是任意的
复制代码
这样的代码。其次,数据的存放之所是个问题,显然你不能将它保存在any类中,那会导致any类成为模板类,后者是明确不被允许的。数据应该动态存放,即动态分配一个数据的容器来存放数据,而any类中则保存指向这个容器的指针,明确地说,是指向这个容器的基类的指针,这是因为容器本身必须为模板,而any类中的指针成员又必须不是泛型的(因为any不能是泛型的,所以any中所有数据成员都不能是泛型的),所以,结论是:为容器准备一个非泛型的基类,而让指针指向该基类。下面就看一看boost库是如何具体实现这两点的。
//摘自”boost/any.hpp”
class any
{
? ?? ???public:
? ?? ???class placeholder? ? //泛型数据容器holder的非泛型基类? ?
? ?? ???{? ?? ?? ?? ?? ?? ???
? ?? ?? ?? ?? ? public: // structors
? ?? ?? ?? ?? ? virtual ~placeholder() //虚析构函数,为保证派生类对象能用基类指针析构
? ?? ?? ?? ?? ? {}
? ?? ?? ?? ?? ? public: // queries
? ?? ?? ?? ?? ? virtual const std::type_info type() const = 0; //提供关于型别的信息
? ?? ?? ?? ?? ? virtual placeholder * clone() const = 0;??//复制容器
? ?? ???};
? ?? ???templatetypename ValueType
? ?? ???class holder : public placeholder? ?//
? ?? ???{
? ?? ?? ?? ?? ? public: // structors
? ?? ?? ?? ?? ? holder(const ValueType value) //
? ?? ?? ?? ?? ? : held(value)
? ?? ?? ?? ?? ? {}
? ?? ?? ?? ?? ? public: // queries
? ?? ?? ?? ?? ? virtual const std::type_info type() const
? ?? ?? ?? ?? ? {
? ?? ?? ?? ?? ?? ?? ?? ?return typeid(ValueType);??//ty
您可能关注的文档
- A2 施工组织设计(方案)报审表(JHA).doc
- A2(项目进度计划).doc
- A2报验申请表.doc
- A3基坑土方开挖.doc
- A3脚手架计算书08415.doc
- A3(质量计划).doc
- A4版全套三穗县中医院住院楼基坑支护.doc
- A4版建筑给排水常用管材浅谈.doc
- A4版电工技术交底记录.doc
- A6(培训计划).doc
- 幼儿园全民国家安全教育日PPT.ppt
- 文明礼仪伴我行主题班会课.ppt
- 4.2 《心有一团火,温暖众人心》课件(共26张PPT) 2024-2025学年统编版高中语文必修上册.pptx
- 大模型平民化开启“AI+医疗”新纪元.pptx
- 2《以工匠精神雕琢时代品质》 课件(共28张PPT)2024-2025学年统编版高中语文必修上册.pptx
- 3《鸿门宴》 课件 (共52张PPT)2024-2025学年统编版高中语文必修下册.pptx
- unit 2能力阅读写作拔高练-学九级英语全一册单元模块满分必刷题人教版.pdf
- 9.3 《声声慢(寻寻觅觅)》课件 (共25张PPT)2024-2025学年统编版高中语文必修上册.ppt
- “4·23世界读书日”主题教育班会-阅读启心智,知识筑梦想 课件(共27张PPT).pptx
- 4EAT 变速箱维修手册.pdf
最近下载
- DG_TJ08-40-2010:地基处理技术规范.pdf VIP
- 2024年四川省宜宾市江安区化学中考一诊试卷.doc VIP
- 2024年中考语文总复习专题06:修辞手法(附答案解析).docx
- QCT 468_汽车散热器最新标准规范.pdf
- 《基本分析与技术分析相结合的A股投资策略案例报告》6200字.doc
- 2 TNC 640 HSCI加工中心和铣车复合加工机床数控系统.pdf VIP
- 2024年四川省宜宾市江安中学中考物理一诊试卷 .docx VIP
- 节能与新能源汽车技术路线图2.0_完整下载版.pdf
- 一般现在时(第三人称单数形式_)及练习.doc VIP
- 医院医保办个人年度述职报告与医院医保办个人总结汇编.doc VIP
文档评论(0)