[转载]自定义bool类型转换操作符

 

原文地址:http://blog.sina.com.cn/s/blog_6f10a7bf0100n6zv.html

 

假如有个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
{
 
public:
  typedef 
void (Condition::*safe_bool)();
  
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选择了后者,你呢?

 

 

 

posted @ 2011-08-30 10:47  edwardlost  阅读(699)  评论(0编辑  收藏  举报