C++ 您在实际工作中使用过boost::tribool吗?

C++ 您在实际工作中使用过boost::tribool吗?,c++,boost,C++,Boost,tribool给我的印象是Boost最奇怪的一个角落。我看到它与使用枚举相比有一些便利,但是枚举也可以很容易地扩展以表示3个以上的状态 在你使用TwiteOL的真实世界中, < P>虽然我没有使用C++,因此Boost,我在一个网络应用程序中广泛使用了三个状态变量,在这里我需要将状态存储为真/假/挂起。它避免了使用“幻数”或额外的标志来确定变量的值是“可能”还是“未知” 而不是true或false,tribool的状态为true,false或不确定 假设您有一个数据库,其中包含客户及其出生日期的

tribool给我的印象是Boost最奇怪的一个角落。我看到它与使用枚举相比有一些便利,但是枚举也可以很容易地扩展以表示3个以上的状态


在你使用TwiteOL的真实世界中,

< P>虽然我没有使用C++,因此Boost,我在一个网络应用程序中广泛使用了三个状态变量,在这里我需要将状态存储为真/假/挂起。它避免了使用“幻数”或额外的标志来确定变量的值是“可能”还是“未知”

而不是
true
false
tribool
的状态为
true
false
不确定

假设您有一个数据库,其中包含
客户
及其
出生日期
的列表。因此,您可以沿着以下几行编写函数:

tribool IsCustomerAdult(customerName);
函数返回:


非常有用。

我是Boost库的忠实粉丝,并在我离开的公司开始使用它。在整个项目中广泛接触和使用boost库后,我偶然发现了tribool,并考虑使用一些需要改进的“模糊逻辑”算法

在我有机会进入它之前,我就离开了,但除了“模糊逻辑”的例子之外,系统中的其他模块都有这种中间状态的组件,现在考虑到这一点,如果我还在公司的话,我可能最终会在相当多的代码中使用tribool


-bn

我看到过许多例子,两个布尔值被用来表示三种可能的状态,无论是显式的还是非显式的,第四种状态被默认为不可能。至少在两种情况下,自从我们开始使用boost以来,我已经将这种结构改为使用tribool。

我认为它对于语言造型(如OCR应用程序和语音合成)非常有用,因为正如你所知,人类语言是模糊的,它们有很多中间状态


展望使用tribool改进当前技术的前言

我认为额外的好处不仅是第三个值,还在于您可以轻松使用三值逻辑

例如:

(true && indeterminate) == indeterminate
(true || indeterminate) == true

SQL实现了这样的逻辑。

如果找不到客户,我会抛出一个异常,但我可以看到tri-state在后者中是多么有用。在这种情况下,
boost::optional
也是一个选项。哇,我没有注意到它
optional
tribool
或多或少地映射了相同的概念(“假、真或完全其他的东西”),尽管它们的语义非常不同。现在我想知道什么是
可选的
。@DanielW:不太可能。我不认为我的评论总体上是正确的,但是如果你有一个容器,你希望它包含你所有客户的生日(并且你希望能够保证它,因为它是容器的一个不变量),那么返回一些由于你提供的保证而明显不可能的东西是毫无意义的。@Luis Machuca。可选(在数据库示例中)可能有助于区分“未找到记录”(可选为空)和“已找到记录但未找到出生日期”(可选存在,但tribool值不确定)我也是如此,尽管使用bools可能一开始就不合适,而且由于应用程序已成熟,我确信条件(规格等)我们不会改变到4或5个州。很好的用例。是的,一般异步或轮询情况似乎很适合tribool。但是您的应用程序是否使用了与
boost::tribool
相同的逻辑?即
(bool)triValue
true
iff
triValue==true
triVal1==triVal2
是不确定的
如果任何值是不确定的
等。?如果没有逻辑操作,
tribool
看起来毫无用处,因为很容易用枚举替换它。哇,我只是简单地假设任何涉及
null
的比较都会衰减为
null
,但是在研究这一点(对于SQL),你是对的:
null或true==true
。精神崩溃。
(true && indeterminate) == indeterminate
(true || indeterminate) == true