4.7.3 为第三态更名
tribool库默认采用indeterminate作为第三态的名字,很清晰明确但可能有些长。因此库允许把indeterminate改变成任意用户喜欢的名字,常用的名字可以是unknown、maybe、true_or_false等等。
只需要在全局域内使用宏BOOST_TRIBOOL_THIRD_STATE就可以为第三态更名,像这样:
- BOOST_TRIBOOL_THIRD_STATE(unknown)
然后我们就可以随意使用这个新名字代替原来的indeterminate:- tribool tb(unknown); //可以作为不确定值
- assert(unknown(tb)); //可以作为检测函数
- assert(unknown(tb || false));
改名的原理很简单:
tribool默认的第三态indeterminate不是一个真正的类型值(typedef或者enum),而是一个函数,它被用来判断tribool对象内部值是否是第三态,宏BOOST_TRIBOOL_ THIRD_STATE只是定义了一个新的等价函数而已,类似这样:
- inline bool some_name(tribool x)
- { return x.value == tribool::indeterminate_value; }
因为宏BOOST_TRIBOOL_THIRD_STATE实质上定义了一个函数,而C++(www.cppentry.com)不允许函数嵌套,所以这个宏最好在全局域使用,它将在定义后的整个源代码中都生效。
如果把BOOST_TRIBOOL_THIRD_STATE用在一个名字空间里,那么新的第三态名字将成为名字空间的一个成员,使用时需加上名字空间限定,例如:
- namespace tmp_ns //一个临时名字空间
- {
- BOOST_TRIBOOL_THIRD_STATE(unknown)
- };
- tribool tb(tmp_ns::unknown); //使用名字空间限定