简介
boost.tribool类似于c++内建的bool类型,不过却又三种状态:true(真),false(假),以及indeterminate(不确定状态)。
使用tribool组件,应该在程序中包含头文件
类摘要
class tribool
{
public: // 缺省构造
tribool(bool value);
tribool(bool initial_value);
//初始化为不确定状态, 该参数实际上是一个指针类型。
tribool(indeterminate_keyword_t);
operator safe_bool()const; // bool 转型
enum value_t
{
false_value, true_value, indeterminate_value
} value;
};
//(判断为不确定的指定方法)
bool indeterminate(tribool x); // 判断是不是为不确定状态。
tribool operator! (tribool x); // ..!重载
...
tribool 的操作是通过逻辑运算符和比较运算符的重载来完成的,包括|| && ! == 和!=,这些都可以任意混合bool和tribool一起使用。
- * 任何与indeterminate的比较操作结果都是indeterminate;*
- 与indeterminate的逻辑或运算(||)只有与true运算时结果为ture,其他结果都为indeterminate
- 与indeterminate的逻辑与运算(&&)只有与false运算时结果为false,其他均为indeterminate
- indeterminate的逻辑非操作(!)结果都为indeterminate
用法
如果你仅仅使用它的true和false两种状态,那么和bool没有什么区别,如果你需要用到不确定状态,那么你必须遵循三态布尔运算。
#include <iostream>
#include <boost\logic\tribool.hpp>
using namespace boost;
using namespace std;
void main()
{
tribool tb(true); // bool值 初始化
tribool tb2(!tb); // false
if (tb) // tb == true
{ cout << "true" << endl; }
tb2 = indeterminate; // 赋值为不确定状态
assert(indeterminate(tb2)); // 检测是不是不确定状态
cout << "tb2 = " << tb2 << endl;
if (tb2 == indeterminate)//不能这样操作,无意义不会执行
{ cout << "indeterminate" << endl; }
if (indeterminate(tb2)) //判断是否为不确定状态
{ cout << "indeterminate" << endl; }
// || && 操作
cout << (tb2 || true )<< endl;
cout << (tb2 && false )<< endl;
}
注意tribool 与optional的区别
虽然两者在功能上有些类似,一个没有初始化的optional同样可以表示一个不确定的bool值。但是还是有本质的区别:optional语义上表示未初始化的bool,是无意义的。而 tribool为indeterminate时,是一个初始化的未知状态。