秘笈2 在容器-变量中存储任意值 2.doc
上传人:qw****27 上传时间:2024-09-12 格式:DOC 页数:1 大小:14KB 金币:15 举报 版权申诉
预览加载中,请您耐心等待几秒...

秘笈2 在容器-变量中存储任意值 2.doc

秘笈2在容器-变量中存储任意值2.doc

预览

在线预览结束,喜欢就下载吧,查找使用更方便

15 金币

下载此文档

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

秘笈2在容器/变量中存储任意值《深入实践Boost:Boost程序库开发的94个秘笈》第1章开始编写应用程序,本章中,我们将看到一些日常使用的秘笈。将学到如何从不同来源获得配置选项和利用Boost库作者介绍的一些数据类型能做出什么“菜”来。本节为大家介绍秘笈2在容器变量中存储任意值。AD:秘笈2在容器变量中存储任意值如果你曾经用Java、C#或Delphi编程,你一定会希望能够在C++中创建Object值类型的容器。这些语言的Object类是几乎所有类型的一个基类,所以你(几乎)可以在任何时候分配任意值给它。试想一下,若在C++中有这样的功能,这将是多么棒的事:准备我们将使用只包括头文件的库。这个秘笈只需要有C++的基础知识。做法在这种情况下,Boost提供了一种解决方案,即Boost.Any库,它甚至有一种更好的语法:太好了,是不是?顺便说一下,它有一个空的状态,且可以使用empty()成员函数检查(就像在STL容器中)。可以使用两种方法从boost::any获得值:工作原理boost::any类只是在其中存储任意值。为了实现这一目标,它使用类型擦除(typeerasure)技术(与Java或C#对其所有类型做的事很接近)。要使用该库,真的不需要知道它的内部实现。下面快速了解一下类型擦除技术。Boost.Any在对类型T的某个变量赋值时,构造一个可以存储指定类型T的值,并派生自某个内部基础类型占位符的类型(姑且称为holderT)。占位符有获取存储类型的std::type_info和用于克隆一个存储类型的虚函数。当any_castT()被使用时,boost::any会检查存储值的std::type_info是否等于typeid(T)(用重载的占位符的函数获得std::type_info)。还有更多这种灵活性总是要付出代价的。为boost::any的实例复制构造、值构造、复制赋值和赋值将调用一个动态内存分配函数;所有类型的强制转换需要获得运行时类型信息(runtimetypeinformationRTTI);boost::any大量使用虚函数。如果你热衷于性能,那么请看下一个秘笈,它将给你提供一个如何在不用动态分配和RTTI的情况下实现几乎相同结果的思路。Boost.Any的另一个缺点是,它不能在禁用RTTI时使用。虽然有可能使这个库可在禁用RTTI时使用,但目前尚未实现。几乎所有Boost的异常都来自std::exception类及其衍生物,HYPERLINK"http://eupai.net"高山茶eupai.net例如,Boost::bad_any_cast派生自std::bad_cast。这意味着可以使用catch(conststd::exceptione)捕获几乎所有的Boost异常。参见Boost的官方文档提供了更多一些例子,可以在doclibs1_53_0dochtmlany.html上找到这些例子。秘笈4提供这个话题的更多信息。【责任编辑:bookTEL:(010)68476606】回书目上一节下一节XML案例解析教程本书对开发XML应用程序给予了详细指导,其中一些应用程序甚至对于您来说是完全陌生的。这些应用程序包括XML1.0,以及与XSLT、XQ