[英]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::none
或if(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.