你有没有在实际工作中使用过boost :: tribool?

Duc*_*uck 18 c++ boost

tribool让我成为Boost最奇怪的角落之一.与使用枚举相比,我看到它有一些方便性,但枚举也可以轻松扩展,代表3种以上的状态.

你用现实世界的方式使用tribool吗?

Mat*_*ley 19

虽然我没有使用C++,因此我已经在网络应用程序中广泛使用了三态变量,我需要将状态存储为true/false/pending.

  • 是的,一般的异步或轮询情况似乎很适合tribool. (3认同)

Rob*_*ino 15

任何值类型的额外状态都非常有价值.它避免使用"幻数"或额外标志来确定变量的值是"可能"还是"未知".

取而代之的truefalse,的状态tribooltrue,falseindeterminate.

假设您有一个包含列表customers及其列表的数据库dateOfBirth.所以你写了一个函数:

tribool IsCustomerAdult(customerName);
Run Code Online (Sandbox Code Playgroud)

该函数返回:

`true` if the customer is 18 or older;
`false` if the customer is less than 18;
`indeterminate` if the customer is not in the database 
     (or the dateOfBirth value is not present).
Run Code Online (Sandbox Code Playgroud)

很有用.

  • 对于这种情况,`boost :: optional`也是一个选项. (8认同)
  • 哇,没有注意到它......"可选的<bool>"和"tribool"或多或少地映射了相同的概念("假,真或其他完全不同"),尽管它们的语义完全不同.现在我想知道什么是`可选的<tribool>`用于...... (3认同)
  • 如果找不到客户,我会抛出异常,但我可以看到三态对后者有用. (2认同)
  • @DanielW:不是.我不认为我的评论一般都有,但如果你有一个容器,你希望包含所有客户的生日(并且你希望能够保证它,因为它是容器的不变量),那么返回的东西是由于您提供的保证毫无意义,因此明显不可能. (2认同)
  • @Luis Machuca.可选的<tribool>可能很有用(在数据库示例中)区分"找不到记录"(可选 - 空)和"找到记录但没有dateOfBirth"(可选 - 存在但tribool值不确定) (2认同)

小智 9

我认为额外的好处不仅是第3个值,而且还可以轻松使用3值逻辑!

例如:

(true && indeterminate) == indeterminate
(true || indeterminate) == true
Run Code Online (Sandbox Code Playgroud)

SQL实现了这样的逻辑.


Tim*_*ter 5

我已经看到了很多例子,两个布尔值被用来代表三个可能的状态,明确地或其他地方,第四个状态被默默地认为是不可能的.至少在两种情况下,我已经改变了这样的结构,因为我们开始使用boost来使用tribool.