簡體   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