作者:苏林 来源:CSDN博客   酷勤网收集 2008-04-01

摘要
  Boost是极有才华的程序员们编写的C++库。Boost中的编程技巧、对C++及泛型的使用方式、以及其最终实现的效果都令人吃惊,甚至叹为观止。C++是强类型语言,有严格的类型检查。而Boost使用C++实现了弱类型的效果,着实在C++的墙上打了一个洞。

Boost是极有才华的程序员们编写的C++库。Boost中的编程技巧、对C++及泛型的使用方式、以及其最终实现的效果都令人吃惊,甚至叹为观止。C++是强类型语言,有严格的类型检查。而Boost使用C++实现了弱类型的效果,着实在C++的墙上打了一个洞。

C++的强类型特征曾被视为一种优点。至今它仍然也是优点。严格的类型检查可以帮助程序员检测出代码中的错误,可以提醒程序员注意到数据的取值范围,可以规范程序员对变量的使用,并在一定程度上增加程序的易读性。可以说C++编译器对数据类型的检查筑起了一堵类型高墙,对变量任何错误的赋值、错误的使用都会被挡住,任何可能会出错的地方都会被提醒。比如下面的代码,在编译的时候是通不过的。

int i;

i = "I am a string!";

这堵墙被筑在了编译器上,而在这堵墙之后,在程序的运行期,则几乎完全没有类型检查。不仅如此,类型信息似乎已经被抛弃了。程序不能在运行期得到数据的类型信息,因此也无法在运行期依据类型选择相应的操作。

比如在C++中就实现不了像下面这样的语句:

void * makePlace( para)

{

    int len;

    len = para类型数据占用空间的大小;

    return 分配len个字节的内存;

}

在模板被引入之前,C++中只能用函数重载来增加可读性。使多个类型的内存分配功能都使用makePlace这个函数名,如:

void * makePlace (int para)

{

    return new char[sizeof(para)];

}

void * makePlace (float para)

{

    return new char[sizeof(para)];

}

如果有很多类型,那么就要写很多个makePlace。这些makePlace函数都是相似的。这只是一个简单的例子,事实上,有很多算法、结构都是可以应用到多种数据类型的,而为每种类型重写一堆代码,显然麻烦的很。

后来C++增加了泛型特征,可以在程序中使用模板。模板放在类型墙的前面,相当于一个变身器。把一个类型无关的算法放进来,生成一个符合类型法则的新算法,然后再放过到墙的另一边去。比如上面的makePlace代码,可以写成下面这样:

template<typename T>

void * makePlace(T para)

{

    return new char[sizeof(T)];

}

也许在C++中引入泛型模板只是为了这个朴素的目的,让程序员少做些重复的工作。也许泛型标准的设计者当初认为这一点算不上类型墙上的裂缝,不会影响到C++的强类型特征。呵呵,想想IE浏览器忙着封堵的那些漏洞吧。

这世上总会有一些智慧让你惊。Boost就是这样的东西。

Boost没有修改C++的任何规则。它是一个完全符合C++规范的代码库。

但是看看这段代码(摘自刘未鹏的文章:泛型指针类any之海纳百川):

int i;

long 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

 

噢。。。这是什么,那个anyVal是什么类型的?any?它能除了int,long,X,还能赋值成别的类型么?这是C++程序么? 还是别的什么东东?

any是Boost的泛型指针,它确实可以赋值成任何类型。any其实是一个类。但any确实可以是任何类型。但单纯的any也什么类型也不是。当它是C#中的var好了。

再看看下面这段代码(摘自刘未鹏的文章:泛型指针类any之海纳百川):

#include "boost/assign/std/vector.hpp"

using namespace boost::assign;

vector i_v;

i_v += 1,2,3,4,5;

看看上面代码中最后一句的赋值语句。你真的还相信这是C++程序么?这样的代码能通过编译么?在C++编译器这堵墙还竖立在那里的时候,Boost能让这些代码顺利穿过么?

Boost做到了!

我想知道Boost是怎么做到的,我下载了Boost的源文件,我看到了Boost的源代码,我看到了复杂的模板,我看到了自己想像不出的高超技巧! Boost确实能在C++中实现这些代码。

事实上Boost实现的效果远不止文中描述的这些。Boost的源代码似乎也高于我的智慧,以至于我仍没有完全弄清楚它是怎么实现的,只能以后慢慢研究了。

C++的类型检查、语法规范等都很严格。它们像墙一样保护了C++程序的安全,并严格限制了C++的代码。Boost是使用C++编写的库,符合C++规范却让弱类型操作和奇怪的语句顺利穿过了这些墙。我觉得Boost不只是在发展C++,也是在C++自己的墙上打洞。

作者:苏林

评论更加精彩:

#  twist 发表于2008-03-24 16:27:28  IP: 222.84.95.*
貌似你根本就不了解C++


#  chh 发表于2008-03-24 17:40:18  IP: 207.46.92.*
any 就是个功能非常强的类,可以包容所有类型,但在对象赋值等可能会遇到困难的。


#  Oversense 发表于2008-03-24 18:06:12  IP: 121.35.120.*
晕死...


#  crashbluebird 发表于2008-03-24 20:25:01  IP: 59.71.192.*
比如在C++中就实现不了像下面这样的语句:
void * makePlace( para)
{
int len;
len = para类型数据占用空间的大小;
return 分配len个字节的内存;
}
===========================
void* makePlace(anytype para)
{
return malloc(sizeof para);
}

可能我没看懂你说的意思

    
2008-03-25 09:05:13作者回复:
我的意思是说像类型占用空间大小这样的类型信息是不能在运行期得到的。sizeof依然是编译期决定的值,所以您代码中的函数仍只适用于一种数据类型,而不是文中那样的可以针对多种类型分配空间。


#  gogovista 发表于2008-03-24 20:39:19  IP: 122.5.68.*
都不想说什么了
看不懂boost的话先研究一下loki.........

    
2008-03-25 09:06:02作者回复:
谢谢提醒


#  luciferji 发表于2008-03-24 20:43:43  IP: 116.22.160.*
#define makePlace(x) new char[sizeof(x)]

{
int i = 0;
int* ptr = makePlace(i);
}
...

    
2008-03-25 09:10:07作者回复:
呵呵,这样的确可以, 看来举例还是不够严谨


#  minlpad 发表于2008-03-24 21:49:29  IP: 219.233.69.*
井底之蛙看见个屁就当天。。。。。。。。


#  wxx 发表于2008-03-24 23:24:07  IP: 221.223.148.*
如果没记错:boost的any虽然好,只是在具体取值的时候发现类型丢失了。需要自己转换,shit,还是麻烦。

    
2008-03-25 09:15:07作者回复:
其实我个人对boost能起到的实际作用也不怎么感冒,在类型方面煞费苦心地做的像新语言之类的样子,倒不如改用新语言。不过Boost里的编码太有技巧性了,至少我不得不感叹


#  stone 发表于2008-03-25 09:10:43  IP: 159.226.165.*
boost::any无法在容器中使用。这样实用性就不强了


#  raof01 发表于2008-03-25 09:36:07  IP: 202.96.60.*
“不仅如此,类型信息似乎已经被抛弃了。”——类型信息没有被抛弃。虽然每个对象在运行期看起来是没有类型信息的“泥巴”,但还是可以获得其类型信息的,否则dynamic_cast<>()怎么工作?至少,类型的大小在运行期是有的。


#  oowgsoo 发表于2008-03-25 10:10:32  IP: 202.107.201.*
稍微大点的C++代码中根本无法完全屏蔽强制的类型转行,C++必须在强类型和效率之间进行权衡,按照你的逻辑,C++自己早就给自己打洞了,还用等boost,不是见了一个any就这么多感慨吧,有点大惊小股的说


#  baodi_z 发表于2008-03-25 10:24:24  IP: 59.61.91.*
有什么大惊小怪的,操作符重载你就这样惊奇,


#  duyanning 发表于2008-03-25 11:23:48  IP: 202.117.10.*
有些人说话怎么这么不好听。


#  wfh_178 发表于2008-03-25 11:45:37  IP: 203.117.170.*
作者为了吹捧boost就把自己说得给个小白一样,没必要大惊小怪的,不就是玩玩技术而已...


#  wfh_178 发表于2008-03-25 11:54:57  IP: 203.117.170.*
90年代初的CORBA里面就有any了,还有dynamic any,JAVA,C++里都有这样的东西,用的很多.其实boost并没有作者说的那么牛逼,你看loki的智能指针和boost的比较一下就知道了.还有boost的线程库和ACE的比较下.作者屁颠屁颠的就在那里惊讶,真是贻笑大方.引用minlpad 发表于2008-03-24 21:49:29 IP: 219.233.69.*
井底之蛙看见个屁就当天。。。。。。。。


#  westhood 发表于2008-03-25 18:06:56  IP: 219.239.98.*
看了最新一期的《程序员》》。Any 最大的意义貌似是提供了一种类型擦出的方法。


#  Mephisto_76 发表于2008-03-25 19:21:54  IP: 221.6.3.*
boost是很强大,而且boost是在遵守C++标准的情况下出来的。支持boost,支持作者一把。

当然boost也有不完美和不优雅之处,但是这些问题需要从语言角度来修正。很多人都说boost没有什么了不起,但是只有他明白了boost是什么以后,他才真的有资格评价boost到底不好在什么地方。


#  Mephisto_76 发表于2008-03-25 19:24:03  IP: 221.6.3.*
boost在是语言有了魔术般的效果的同时,却依旧保持了C++的静态类型检查的特性,并且还做了适当的强化。
泛化却没有丢失强类型的优点。这些东西难道是void*、object、interface something之流能够比拟的吗?


#  wingfiring 发表于2008-03-26 12:20:13  IP: 202.95.81.*
# stone 发表于2008-03-25 09:10:43 IP: 159.226.165.*
boost::any无法在容器中使用。这样实用性就不强了
-------------------------------

是你搞错了,还是我搞错了?

来自:http://blog.csdn.net/Slin000/archive/2008/03/24/2213220.aspx

分类: C++名库 编程语言



关于酷勤 | 联系方式 | 免责声明 | 友情链接