tribool
boost.tribool类似c++内建的bool类,但基于三态的布尔逻辑,在true和false之外还有一个indeterminate状态。一个例子场景是执行某项任务,在执行之前状态时未知的,启动任务后状态时true,停止任务状态时false.
tribool位于名字空间boost::logic,当为了方便使用,需要包含头文件<boost/logic/tribool.hpp>:
#include <boost/logic/tribool.hpp>
using namespace boost;
类摘要:
class tribool
{
public:
tribool(bool value); //缺省构造函数
tribool(bool initial_value); //bool值构造函数
tribool(indeterminate_keyword_t);//初始化为不确定值
operator safe_bool() const; //bool转型
enum value_t { false_value,true_value,indeteeminate_value } value;
};
bool indeterminate(tribool x);
tribool operator!(tribool x);
...
tribool类内部实现了三态bool值得表示,除了构造函数没有其他成员函数,可以在创建tribool对象的同事传入三态bool值对它进行初始化,如果使用无参的缺省构造函数,tribool默认值是false.
对tribool的操作都是通过逻辑运算符和比较运算符的重载来完成的,支持的逻辑运算符包括||,&&和!= ,这些操作都可以任意混合bool和tribool一起运算.
不确定状态indeterminate是一个特殊的tribool值,它与bool值true,false的运算遵循三态不二逻辑:
-
任何与indeterminate的比较操作结果都是indeterninate
-
与iddeterminate的逻辑或运算(||)只有与true运算结果为true,其他均为indeterminate
-
与indeterminate的逻辑与运算(&&)只有与false运算结果为false,其他均为indeterminate
-
indeterminate的逻辑非操作(!)结果仍为indeterminate
自由函数indeterminate()可以判断一个tribool是否处于不确定状态。
用法:#include <boost/logic/tribool.hpp> using namespace std; int main() { tribool tb(true); tribool tb2(!tb); if(tb) { cout<<"true"<<endl; } tb2 = indeterminate; assert(indeterminate(tb2)); cout<<tb2<<endl; if(tb2 == indeterminate) { cout<<"indeterminate"<<endl; } if(indeterminate(tb2)) { cout<<"indeterminate"<<endl; } cout<<(tb2 || true)<<endl; cout<<(tb2 && false)<<endl; }
在处理tribool的不确定状态时需要小心,因为他不是true也不是false,使用它进行条件判断永远不会成立,判断不确定状态需要使用indeterminate()函数。