[转载]自定义bool类型转换操作符
原文地址:http://blog.sina.com.cn/s/blog_6f10a7bf0100n6zv.html
假如有个Condition类型的变量flag,我们希望如下使用:
if (flag) do_something;
要做到这一点,需要为Condition提供bool类型转换操作符,使得flag经过一定的类型转换之后成为bool值。有两种策略可以做到。
1. 一步到位:直接将Condition转换成bool类型
{
public:
operator bool() const;
};
优点:接口清晰,直观。
缺点:bool类型可以隐式转换为算术类型如整型,浮点型等,所以较易被误用。比如:
double dd = 100 + ii + flag;
都是合法语句,但不一定是Condition使用者想要的。《effective C++》第三版条款18明确表示类的设计应该让接口容易被正确使用,不易被误用。
2. 曲线救国:先将Condition转换成一个中间类型,而这中间类型可隐式转换成bool类型
先看看什么类型可以隐式转换成bool类型。据C++标准4.12款:算术,枚举,指针,和指向成员指针的右值都可以转换成bool类型右值。零值,空指针,空指向成员指针转换成false,其它的转换成true。算术,枚举,指针类型不是很合适做中间类型,因为它们比bool值更容易被误用。但指向成员指针似乎是个不错的选择。
{
public:
typedef void (Condition::*safe_bool)();
operator safe_bool() const;
};
你也许认为种方法也会被误用,比如:
void (Condition::*mf)() = flag;
可以设计得更绝些来阻止以上用法。
{
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选择了后者,你呢?