4.7.3 为第三态更名

2013-10-07 15:01:33 · 作者: · 浏览: 77

4.7.3  为第三态更名

tribool库默认采用indeterminate作为第三态的名字,很清晰明确但可能有些长。因此库允许把indeterminate改变成任意用户喜欢的名字,常用的名字可以是unknown、maybe、true_or_false等等。

只需要在全局域内使用宏BOOST_TRIBOOL_THIRD_STATE就可以为第三态更名,像这样:

  1. BOOST_TRIBOOL_THIRD_STATE(unknown) 

然后我们就可以随意使用这个新名字代替原来的indeterminate:
  1. tribool tb(unknown);                            //可以作为不确定值  
  2. assert(unknown(tb));                            //可以作为检测函数  
  3. assert(unknown(tb || false));  

改名的原理很简单:

tribool默认的第三态indeterminate不是一个真正的类型值(typedef或者enum),而是一个函数,它被用来判断tribool对象内部值是否是第三态,宏BOOST_TRIBOOL_ THIRD_STATE只是定义了一个新的等价函数而已,类似这样:

  1. inline bool some_name(tribool x)   
  2. { return x.value == tribool::indeterminate_value; } 

因为宏BOOST_TRIBOOL_THIRD_STATE实质上定义了一个函数,而C++(www.cppentry.com)不允许函数嵌套,所以这个宏最好在全局域使用,它将在定义后的整个源代码中都生效。

如果把BOOST_TRIBOOL_THIRD_STATE用在一个名字空间里,那么新的第三态名字将成为名字空间的一个成员,使用时需加上名字空间限定,例如:

  1. namespace tmp_ns                                //一个临时名字空间  
  2. {  
  3.     BOOST_TRIBOOL_THIRD_STATE(unknown)  
  4. };  
  5. tribool tb(tmp_ns::unknown);                    //使用名字空间限定