C++ 您在实际工作中使用过boost::tribool吗?
tribool给我的印象是Boost最奇怪的一个角落。我看到它与使用枚举相比有一些便利,但是枚举也可以很容易地扩展以表示3个以上的状态C++ 您在实际工作中使用过boost::tribool吗?,c++,boost,C++,Boost,tribool给我的印象是Boost最奇怪的一个角落。我看到它与使用枚举相比有一些便利,但是枚举也可以很容易地扩展以表示3个以上的状态 在你使用TwiteOL的真实世界中, < P>虽然我没有使用C++,因此Boost,我在一个网络应用程序中广泛使用了三个状态变量,在这里我需要将状态存储为真/假/挂起。它避免了使用“幻数”或额外的标志来确定变量的值是“可能”还是“未知” 而不是true或false,tribool的状态为true,false或不确定 假设您有一个数据库,其中包含客户及其出生日期的
在你使用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
ifftriValue==true
triVal1==triVal2
是不确定的
如果任何值是不确定的
等。?如果没有逻辑操作,tribool
看起来毫无用处,因为很容易用枚举替换它。哇,我只是简单地假设任何涉及null
的比较都会衰减为null
,但是在研究这一点(对于SQL),你是对的:null或true==true
。精神崩溃。
(true && indeterminate) == indeterminate
(true || indeterminate) == true