网站大量收购独家精品文档,联系QQ:2885784924

Boost源码剖析之:泛型指针类any之海纳百川.doc

Boost源码剖析之:泛型指针类any之海纳百川.doc

  1. 1、本文档共8页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 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

文档评论(0)

ligennv1314 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档