繁体   English   中英

带有布尔字段默认初始化的结构?

[英]Struct with boolean field default initialization?

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

struct a {

    int field1;
    bool field2;
    bool field3;

};

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

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

我的意思是我应该能够将 struct a 定义为

a : field1(null.int), field2(null.bool), field3(null.bool) {}

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

a: field1(-1), field2(false), field3(false) {}

你可以做

struct a {
    a():field1(), field2(), field3() { }
    int field1;
    bool field2;
    bool field3;
};

所有字段将分别为零和假。 如果你想说这些字段有一个不确定的值,恐怕你必须使用其他技术。 一种是使用boost::optional

struct a {
    a():field1(int()), field2(bool()) { }
    optional<int> field1;
    optional<bool> field2;
    optional<bool> field3;
};

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

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

[编辑] 或std::optional ,因为 C++17。

一个布尔值有两种状态。 这就是使它成为布尔值的原因。 因此,在任何强类型语言中,布尔值要么是真要么是假。

c/c++(和java)中的整数是数字的直接二进制表示。 您可以为该数字指定一个值来表示“该数字没有价值”,但这在所有情况下都没有意义 - 如果语言要考虑到这一点,则每个数学运算都必须先进行检查- 它真的会减慢速度。

底线:如果您想要弱类型系统,请使用另一种语言。

您似乎希望能够说字段处于未定义状态。

这违背了强类型语言(如 C++)的原则,所以你很不走运。
如果你想检查是否已经定义了某些东西,你需要自己明确地跟踪它。 您可能会使用指针来解决您的问题,但我个人认为这不是一个好主意。

也许如果你试图解释你试图解决的真正问题,我们可以提供更好的建议。

这是 C++ 的方式,不为您不使用的任何东西付费,默认初始化和具有未初始化 bool 的能力是许多人不需要的。

如果您真的想要这种行为,您可以构建您正在使用的类型的可为空版本。 沿线的东西:

class NullBool {
  bool m_null;
  bool m_value;
  public:
  NullBool() : m_null(true) {}
  NullBool(bool value) : m_null(false), m_value(value) {}
  void isNull() const {
    return m_null;
  }
  void value() const {
    return m_value;
  }
  ...
  // lots of operations
  ...
};

这可能应该构建为模板,以便它适用于更多类型的开箱即用。 而且由于它是您自己的类型,因此您可以轻松地将默认构造函数设置为默认情况下为 null。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM