没有在c ++中设置布尔值

时间:2016-03-03 15:42:03

标签: c++ boolean

在c ++中有三个值布尔变量的最佳方法是什么?

我希望在我的数组中将字段设置为truefalse或根本不设置。

如果我这样声明:

t[0] = true;
t[1] = false;
t[2] = NULL;

当我测试条件时,我得到:

t[2]false

7 个答案:

答案 0 :(得分:4)

我通常会这样做:

t[0] = true;
t[1] = false;
t[2] = -1;

或者,如果您只需要3个州,但可能在某个时候想要更多,enum很棒:

enum STATES
{
    NULL_STATE = -1,    // you can manually specify -1 to give it a special case value
    FALSE,              // will be equal to 0
    TRUE                // will be equal to 1
};

无论如何,0/false是唯一在false语句中返回if()的内容。 -1true都返回true

您可能希望使用这样的开关来处理3种以上的状态:

switch (var)    // may need to cast: (int)var
{
case 1:
case 0:
case -1:
};

或者,如果你想坚持使用if语句块,你可以这样做:

if (var == -1)    // or (var == NULL_STATE)
{}
else if (var)     // true condition
{}
else              // false
{}

答案 1 :(得分:3)

您可能需要查看boost.tribool:http://www.boost.org/doc/libs/1_60_0/doc/html/tribool.html

答案 2 :(得分:3)

考虑使用std::experimental::optional<bool>(如果您的C ++标准库拥有它)或boost::optional<bool>(www.boost.org)。

我相信std::optional是C ++ 17的候选者,所以如果你采用上述其中一种,那么你对C ++ 17的重构努力应该是最小的。

如果你不喜欢在“适当的”C ++标准库中使用那些(但是?)的东西,那么考虑

  1. 基于std::unique_ptr<bool>

  2. 的内容
  3. A std::pair<bool, bool>

  4. 一个好的老式enum,有3个值。

答案 3 :(得分:2)

你可以使用boost :: optional

http://www.boost.org/doc/libs/1_60_0/libs/optional/doc/html/index.html

boost::optional<bool> myBooleanVariable;

我同意如果你不需要未初始化的值为NULL,那么tribool会更好。在比较可选和tribool时,文档说:

  

首先,它在功能上类似于三态布尔值(假,可能,真) - 例如boost :: tribool-除了在三态布尔值中,可能状态表示有效值,不像未初始化的相应状态可选的。如果真的需要可选而不是tribool,应该仔细考虑。

来源:http://www.boost.org/doc/libs/1_60_0/libs/optional/doc/html/boost_optional/a_note_about_optional_bool_.html

答案 4 :(得分:1)

  

在c ++中拥有三个值布尔变量的最佳方法是什么?

根据定义,布尔值仅具有2种可能的状态-正确或错误。 如果您想为“无效”或“未设置”设置其他状态,则需要将bool变量封装在其他一些数据类型中。

正确的解决方案取决于您要对该变量执行的操作。 为了进行简单比较(if-else和switch),应该首选作用域枚举(c ++ 11)。

enum class tristate{true,false,undefined=0};

它们简单,易用且易于理解,并提供了较安全的旧枚举类型安全性。由于它们是类型安全的,因此您不能无意间将它与不同类型的枚举或数字类型进行比较,但这也意味着您也不能使用位摆弄和整数技巧。 除非指定了其他类型,否则枚举类是数值类型,它将被初始化为“ 0”。这意味着通过将值“ 0”分配给枚举值之一,您可以将其设置为默认状态。

tristatet[7];
t[1] = tristate::true;
t[2] = tristate::false;
t[3] = tristate::undefined;
t[4] = false; //error
t[5] = 0; //error
t[6] = null; //error

t[0] == true; //error
t[0] == tristate::true; // false
t[0] == tristate::undefined; // true

您当然可以在切换语句中使用它:

switch(t[2]) {
  case tristate::true:
       foo(); break;
  case tristate::false:
       bar(); break; //t[2] was set to tristate::false
  case tristate::undefined :
       doNothing(); break; 
}

答案 5 :(得分:1)

我还相信枚举声明是更干净,最简单的解决方案。

关于新类型的大小的小注释:枚举(通常取决于编译器)通常由整数支持,因此您要分配32或64位之类的东西来实际使用2位。

在较新的C ++(C ++ 11)中,可以指定枚举的基础类型(为现有的整数类型)。例如:

enum tribool: uint8_t {False = 0, True = 1, Unknown = 2};
...
enum tribool f = tribool::False;

答案 6 :(得分:0)

您可以使用std::optional

std::optional<bool> t[3];

t[0] = true;
t[1] = false;
t[2] = std::nullopt;

for (auto const& i : t)
  if (i.has_value()) std::cout << i.value() << '\n';

输出:

1
0