自定义bool类型转换操作符

假如有个Condition类型的变量flag,我们希望如下使用:

Condition flag;
If (flag) do_something;

要做到这一点,需要为Condition提供bool类型转换操作符,使得flag经过一定的类型转换之后成为bool值。有两种策略可以做到。

1.  一步到位:直接将Condition转换成bool类型
class
 Condition
{
public
:
 operator
 bool
() const
;
};

优点:接口清晰,直观。

缺点:bool类型可以隐式转换为算术类型如整型,浮点型等,所以较易被误用。比如:

int
 ii = flag;
double
 dd = 100 + ii + flag;

都是合法语句,但不一定是Condition使用者想要的。《effective C++》第三版条款18明确表示类的设计应该让接口容易被正确使用,不易被误用。

2. 曲线救国:先将Condition转换成一个中间类型,而这中间类型可隐式转换成bool类型

先看看什么类型可以隐式转换成bool类型。据C++标准4.12款:算术,枚举,指针,和指向成员指针的右值都可以转换成bool类型右值。零值,空指针,空指向成员指针转换成false,其它的转换成true。算术,枚举,指针类型不是很合适做中间类型,因为它们比bool值更容易被误用。但指向成员指针似乎是个不错的选择。

class
 Condition
{
    typedef
 void
 (Condition::*safe_bool)();
public
:
    operator
 safe_bool() const
; 
};

你也许认为种方法也会被误用,比如:

Condition flag;
void
 (Condition::*mf)() = flag;

可以设计得更绝些来阻止以上用法。

class
 Condition
{
private
:
    struct
 Dummy;
    typedef
 void
 (Condition::Dummy::*safe_bool)();
public
:
    operator
 safe_bool() const
;
};

Dummy类是私有的。除了Condition,其它类或方法没有办法定义指向Dummy成员的指针变量,从而确保bool类型转换符不会被误用。

优点:极大的减少bool类型转换符的误用。

缺点:接口不直观。一般需要额外注释说明。

慢,自定义类型不是也可以隐式转换成bool类型吗?为什么不先将Condition转换成一个自定义类,这个自定义类只负责bool类型转换?看上去是个好主意,但却行不通。C++标准12.3.4明确指出一次值转换最多应用一次自定义的隐式转换。

可以看出上面两种策略各有长短。boost选择了后者,你呢?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值