结构与布尔字段默认初始化?

kal*_*kal 2 c++

我有以下用例,一个带有一些boolean和int变量的结构

struct a {

    int field1;
    bool field2;
    bool field3;

};
Run Code Online (Sandbox Code Playgroud)

我正在重构这段代码,并为struct编写构造函数,问题是字段的默认初始化.

我不是在批评任何语言构造,但理想情况下我希望null成为语言本身的一部分

我的意思是我应该能够为结构a定义为

a : field1(null.int), field2(null.bool), field3(null.bool) {}
Run Code Online (Sandbox Code Playgroud)

C++不允许它,因为没有定义null.int或null.bool.在C++中唯一的方法是

a: field1(-1), field2(false), field3(false) {}
Run Code Online (Sandbox Code Playgroud)

Joh*_*itb 9

你可以做

struct a {
    a():field1(), field2(), field3() { }
    int field1;
    bool field2;
    bool field3;
};
Run Code Online (Sandbox Code Playgroud)

并且所有字段将分别为零和假.如果你想说这些字段具有不确定的值,我担心你必须使用其他技术.一个是使用boost::optional:

struct a {
    a():field1(int()), field2(bool()) { }
    optional<int> field1;
    optional<bool> field2;
    optional<bool> field3;
};
Run Code Online (Sandbox Code Playgroud)

叶子field3不确定.使用访问值*field_name.用field == boost::none或测试无值if(field) { ... }.


MSa*_*ers 5

如果您正在寻找值为 {true, false, null} 的类型,则该类型不是 bool。然而,boost::optional<bool>是这样一种类型。以同样的方式,boost::optional<int> 可以容纳任何 int,或者根本没有 int。

[编辑] 或者std::optional,从 C++17 开始。