分享
 
 
 

Guru of the week #26 Bool.

王朝vc·作者佚名  2006-01-08
窄屏简体版  字體: |||超大  

作者:Hub Sutter

译者:黄森堂

感谢ed9er(始祖鸟)的校验。

/*此文是译者出于自娱翻译的GotW(Guru of the Week)系列文章第一篇,原文的版权是属于Hub Sutter(著名的C++专家,《Exceptional C++》的作者)。此文的翻译没有征得原作者的同意,只供学习讨论。——译者

*/

#26 Bool.

难度:7/10

我们有需要基本的bool类型吗?,现存的语言为什么不是仅仅的仿真它,本期将给你答案。

问题:

自从ARM.[1]发布以来,除了wchar_t之外(wchar_t在C里是用typedef实现的),bool是唯一添加到C++里的基本数据类型;如果不添加这个基本类型,能用已有的数据类型达到相同的效果吗?如果能,请给出一个实现,如果不能,请指出各种可能的实现方法都有哪些缺陷?

解决方法:

自从ARM.[1]发布以来,除了wchar_t之外(wchar_t在C里是用typedef实现的),bool是唯一添加到C++里的基本数据类型;如果不添加这个基本类型,能用已有的数据类型达到相同的效果吗?如果能,请给出一个实现,如果不能,请指出各种可能的实现方法都有哪些缺陷?

回答是:不能,bool明确地添加到C++作为基本类型(并保留true与false关键字),因为它们(bool型和true, false)没法通过现有的语言特性准确实现。

如果不是,将给出同等实现基本类型的几个潜在的原因。

4种主要的实现方法:

第一种:Typedef(评价:8.5/10)

Option 1: Typedef (score: 8.5 / 10)

这种方法用"typedef <something> bool;",典型如:

typedef int bool;

const bool true = 1;

const bool false = 0;

这种解决方法不错,但是不允许重载bool,例如:

// file f.h

void f( int ); // ok

void f( bool ); // ok, 重新声明相同的函数

// file f.cpp

void f( int ) { /*...*/ } // ok

void f( bool ) { /*...*/ } // error, 重定义

另一个问题是跟这相同的代码:

void f( bool b ) {

assert( b != true && b != false );

}

于是可以看出第一种实现不够好!

第二种方法:#define(评价:0/10)

这种方法用"#define bool <something>",典型如:

#define bool int

#define true 1

#define false 0

这种方法是有害的,这不仅仅与上面的第一种方法有相同的问题,而且通常破坏了#defines,例如:它缺乏自定义,且当有人在尝试使用这个库时已经有了变量名字'false';现在就可以从基本类型看到它们的差异。

尝试用预处理程序来模拟这种类型是很坏的主意。

第三种方法:Enum(评价:9/10)

用这种方法去产生"enum bool",典型如:

enum bool { false, true };

这种方法比第一种方法好几分,在这种方法,它允许重载(第一种方法的主要问题),但在条件表达式不允许自动类型转换(第一种方法是可以的):

bool b;

b = ( i == j );

这是错误的,因为int不能隐含地转换成enums

第四种方法:Class(评价:9/10)

这是面向对象语言,对吗?,所以为什么不写个类,典型如:

class bool {

public:

bool();

bool( int ); // 在条件表达式允许转达换

operator=( int ); //

//operator int(); // 有问题!

//operator void*(); // 有问题!

private:

unsigned char b_;

};

const bool true ( 1 );

const bool false( 0 );

除了转换操作有问题之外就可以工作了,这些问题的原因:

1.由于自动类型转达换,重载解决了bool的冲突,(尤其是基本类型的转换)

1. 如果使用自动类型转换,bool型的数据会影响到函数重载,就像其他任何一个类里的隐式构造函数和(或)自动类型转换一样(尤其是基本类型的转换)。

2.不能转换与int或void*相似的类型,bool在条件中不能作测试,例如:

2. 如果不使用自动类型转换,那么bool类型将无法使用在条件判断中 bool b;

/*...*/

if( b ) // 错误,不能转换与int或void*相似的类型

{ //

/*...*/

}

这种方法抓住了22种情形:我们必须选择一个或其它的,两种方法皆让我们

这是一个经典的所谓的Catch-22困境:我们必须也只能选择其中的一个,但没有一种情况可以满足我们的需要:使这个类表现得和基本类型bool一样。

总结:

A typedef ... bool不允许重载。

A #define bool不允许重载且通常破坏了#define

enum bool允许重载但在条件表达式不能进行自动类型转换(相似于"b = (i == j);")。

bool类允许重载但不能让bool对象在条件中作测试,除非它能提供自动转换到基本类型,可它通常以破坏了类型自动转换。

对极了,我们真的很需要基本成的bool类型,最后,还有一件事情(和重载有关的),就是,对于所有的方式(除了在第四种方式下有可能)我们都无法指明那个条件判断表达式是一个bool类型。(我想作者要表达的意思是,对于各种模拟bool的方式,我们都无法把bool当作一种真正意义上的数据类型,并使用它来重载函数,考虑这样的调用:func(i == j); 在被当作参数去寻找匹配的函数之前,你根本无法改变这个条件判断表达式运算的结果的类型,其实我觉得关于这点他在前面已经讲得很清楚了,不知道为什么要称作one more thing)

备注:

1. M. Ellis M and B. Stroustrup. The Annotated C++ Reference Manual (Addison-Wesley, 1990).

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有