提升tribool的使用率

时间:2017-03-22 13:29:06

标签: c++ boost tribool

这是我测试boost :: tribool的样本:

#include <iostream>
#include "boost/logic/tribool.hpp"

int main()
{
boost::logic::tribool init;
//init = boost::logic::indeterminate;
init = true;
//init = false;

if (boost::logic::indeterminate(init))
{
    std::cout << "indeterminate -> " << std::boolalpha << init << std::endl;
}
else if (init)
{
    std::cout << "true -> " << std::boolalpha << init << std::endl;
}
else if (!init)
{
    std::cout << "false -> " << std::boolalpha << init << std::endl;
}

bool safe = init.safe_bool(); <<---- error here
if (safe) std::cout << std::boolalpha << safe << std::endl;

return 0;
}

我正在尝试使用safe_bool()函数将boost :: tribool转换为plain bool但是有complile time error:

Error   1   error C2274 : 'function-style cast' : illegal as right side of '.' operator D : \install\libs\boost\boost_samples\modules\tribool\src\main.cpp  23  1   tribool

看起来我正在使用safe_bool()函数。 你能帮我解决这个问题吗?感谢。

2 个答案:

答案 0 :(得分:3)

safe_bool是一种类型,即函数operator safe_bool()tribool转换为safe_bool。如果您只想转换为常规bool使用的内容:bool safe = init;safe在这种情况下true当且仅当init.value == boost::logic::tribool::true_value

答案 1 :(得分:2)

safe_bool "method"不是常规方法,而是conversion operator

BOOST_CONSTEXPR operator safe_bool() const noexcept;
//              ^^^^^^^^

转换运算符意味着当请求布尔值时,tribool将像bool一样,所以你只需要写:

bool safe = init;  // no need to call anything, just let the conversion happen.

// or just:
if (init) { ... }

您应该注意到运算符返回safe_bool,而不是boolsafe_bool这里实际上是一个内部成员函数指针类型:

class tribool
{
private:
  /// INTERNAL ONLY
  struct dummy {
    void nonnull() {};
  };

  typedef void (dummy::*safe_bool)();

它是在safe bool idiomwhich is obsolete in C++11)之后写的。

tribool为真时指针为非空,重要的是tribool为假或不确定时为空,所以我们可以将结果视为布尔值