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