4.6 使用第三方库
以上介绍了Visual C++对对象赋值、转换及字符编码转换的方法,实际上还有一些好用的第三方类库用以辅助C++程序员完成对象处理,比较著名的就是boost。本节简单介绍boost库中与数值相关的boost::any、boost::lexical_cast,以及有理数类boost::rational。
4.6.1 万能类型boost::any
boost库提供了any类,boost::any是一个能保存任意类型值的类,这一点有点像variant类型,不过variant由于采用了一个巨大的union,效率非常低。而boost利用模板,保存的时候并不改变值的类型,只是在需要的时候才提供方法让用户进行类型判断及取值。
boost::any几乎可以用来存储任何数据类型:
- boost::anyai,as;
- ai=100;
-
as=string("hello");
需要的时候,我们又可以使用any_cast将原来的数据还原:
- inti=boost::any_cast<int>(ai);
- strings=boost::any_cast<string>(as);
当这种转换发生类型不匹配时,会有异常bad_any_cast发生:
- try
- {
-
inti=boost::any_cast<int>(as);
- }
-
catch(boost::bad_any_cast&e)
- {
- }
在传统的C++程序中,为了支持各种数据类型,我们不得不使用万能指针"void *",但是很遗憾的是,基于万能指针的转换是不安全的,"void*"缺少类型检查。所以,我们建议大家尽量使用any类。
现在动手
编写如下程序,体验如何使用boost::any来完成对象类型转换。
【程序 4-10】使用boost::any完成对象类型转换
- 01#include"stdafx.h"
-
02#include"boost/any.hpp"
- 03#include<string>
- 04
-
05usingnamespacestd;
-
06usingnamespaceboost;
- 07
-
08classCat
- 09{
- 10};
- 11
-
12voidprint(anyit)
- 13{
-
14if(it.empty())
- 15{
-
16printf("nothing!\r\n");
-
17return;
- 18}
- 19
-
20if(it.type()==typeid(int))
- 21{
-
22printf("integer:%d\r\n",any_cast<int>(it));
-
23return;
- 24}
- 25
-
26if(it.type()==typeid(string))
- 27{
-
28printf("string:%s\r\n",any_cast<string>(it).c_str());
-
29return;
- 30}
- 31
-
32if(it.type()==typeid(CString))
- 33{
-
34_tprintf(_T("CString:%s\r\n"),any_cast<CString>(it));
-
35return;
- 36}
- 37
-
38if(it.type()==typeid(Cat))
- 39{
-
40_tprintf(_T("oops!acat!\r\n"));
-
41return;
- 42}
- 43}
- 44
-
45intmain()
- 46{
- 47print(100);
- 48
-
49anyas[]={any(),100,string("hello"),CString("world"),Cat()};
-
50for(inti=0;i<sizeof(as)/sizeof(as[0]);i++)
- 51{
- 52print(as[i]);
- 53}
- 54
-
55return0;56}
结果输出如图4-18所示。
|
(点击查看大图)图4-18 运行结果 |
光盘导读
该项目对应于光盘中的目录"\ch04\BoostAnyTest"。
===========================================

以上摘自《把脉VC++》第4.6.1小节的内容,如果你想与我交流,请点击如下链接加我为好友:http://student.csdn.net/invite.php?u=113292&c=8913f87cffe7d533
分享到:
相关推荐
白乔原创:VC之控件篇[3]-VCer_net VC代码 VC开源 VC文章 VC工具 VC知道 VC词典 VC论坛.mht
白乔原创:VC之控件篇-VCer_net VC代码 VC开源 VC文章 VC工具 VC知道 VC词典 VC论坛.mht
白乔原创:VC之控件篇[2]-VCer_net VC代码 VC开源 VC文章 VC工具 VC知道 VC词典 VC论坛.mht
【压缩包子文件的文件名称】"白乔原创:VC之美化界面篇-VCer_net VC代码 VC开源 VC文章 VC工具 VC知道 VC词典 VC论坛.mht",这个单个文件可能是一个MHT(MHTML)文档,它将网页内容包括文字、图片、脚本等元素整合在...
感谢网络前辈的无私分享,再整理一下 WTL 的学习文档。 所有源码都能在 VC6,WTL...7、白乔原创:VC之美化界面篇 8、ComboBox的WTL移植.doc 9、窗口的子类化.docx 10、深入剖析MFC中对于Windows消息处理、运行机制.doc
QQ源码是一个对初学者极具价值的学习资源,尤其是由白乔使用VC++编写的版本。VC++,全称Visual C++,是微软公司推出的一种面向对象的、运行于Windows平台的集成开发环境,它集成了C++编译器,调试器和其他开发工具,...
自己把分散的章节下载下来合并的PDF,完整版把脉VC++ 由于文件大只能分三部分
把脉VC++(上半册) 白乔、左飞编著 电子工业出版社
把脉VC++(下半册) 白乔、左飞编著 电子工业出版社
《标准C++开发入门与编程实践源码》是一本针对初学者和爱好者设计的C++编程书籍,由知名作者白乔编著。本书的核心目的是帮助读者掌握C++语言的基础知识,并通过实际编程项目来加深理解,提升编程技能。在书中,白乔...
### Jena-HBase:一种分布式、可扩展且高效的RDF三元组存储系统 #### 概述 在当今数据密集型应用环境中,处理大规模RDF(Resource Description Framework)数据集的需求日益增长。传统的单机RDF数据存储解决方案...
内容索引:VC/C++源码,网络相关,仿QQ,聊天 fakeQQ 软件杂志中的完整聊天程序源码,作者是白乔,为《电脑爱好者》合订本准备的示例程序。 特别是对VC++新手特别有用处,通过这个示例程序会了解到VC创建工程的步骤、...
【FakeQQ源代码】是一个由白乔为《电脑爱好者》合订本提供的示例程序,旨在教授初学者如何在VC++环境下进行多种编程技术的实践。这个程序包含了多个关键的知识点,下面将逐一进行详细解释。 首先,**对话框界面编程...
微软Visual Studio 2008是一款强大的集成开发环境(IDE),专为软件开发者提供全面的工具和服务,以创建各种应用程序,包括Windows桌面应用、Web应用和移动应用等。这款IDE包含了许多功能,其中之一就是丰富的图片...
它支持完整的SPARQL 1.1规范,包括SELECT、CONSTRUCT、ASK和DESCRIBE四种类型的查询。此外,ARQ还支持使用变量、过滤器、联接、子查询等高级功能,使开发者能够编写出灵活且强大的查询语句。 四、服务端和客户端...
oauth2的示例工程源代码,含build好的war包 来源于github,但build会很耗时间 直接取出2个target目录下的war文件 改名为tonr2.war和sparklr2.war 置于webapps下 启动tomcat后,访问...即可体验演示工程
Bigdata能够支撑的数据量和数据类型的多样性,让它在数据密集型和图形密集型的应用中非常受欢迎。由于其开源的特性,它允许用户免费使用,同时也支持商业许可,确保了企业级用户可以获得必要的技术和服务支持。Big...
spring-security-oauth2下的sparklr2的war包,官方的没有现成的war包,需要使用maven打包,这个是打包好的