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()函数。