在c ++中有三个值布尔变量的最佳方法是什么?
我希望在我的数组中将字段设置为true
,false
或根本不设置。
如果我这样声明:
t[0] = true;
t[1] = false;
t[2] = NULL;
当我测试条件时,我得到:
t[2]
是false
答案 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()
的内容。 -1
和true
都返回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 ++标准库中使用那些(但是?)的东西,那么考虑
基于std::unique_ptr<bool>
A std::pair<bool, bool>
一个好的老式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,应该仔细考虑。
答案 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