我在我自己的滾動結構來表示顏色的過程,這就是我想出了:這種類型的狡猾法律和安全嗎?
struct Color {
typedef uint8_t color_t;
union {
struct {
color_t red, green, blue, alpha;
};
struct {
color_t x, y, z, w;
}
std::array<color_t, 4> _data;
};
/*...*/
};
這樣做是爲了簡化編寫索引代碼的行爲。就像,例如,operator[]
代碼是這樣寫的:
//I haven't written bounds-checking yet.
constexpr color_t & operator[](size_t i) {
return _data[i];
}
constexpr color_t operator[](size_t i) const {
return _data[i];
}
我的理解是,這應該是安全的(實際上,這個代碼編譯和運行,因爲我希望它),但在此我我實際上是正確的假設,還是我可能冒着未定義的行爲寫這樣的代碼?
我相信我在過去的日子裏看到過幾個問題(也許有人會找到重複的,因爲我太懶惰了)。如果不是'union',你會更安全一些,因爲你會引用數組的元素。 –
該結構的源文件可能會很小,那麼爲什麼不直接寫出更大的代碼而不是使用聯合(哪一個應該儘可能避免)呢?另外,我可以問你爲什麼定義operator []嗎?渠道的順序不會自動給出,這意味着沒有人有責任維護它。如果您需要在某個文件中編寫顏色,請將該責任交給顏色結構本身或寫入該圖像類的圖像類,然後使用使命令清晰的代碼,如「<<紅色<<綠色<<藍色'。 – Aziuth
除此之外:你不需要實現邊界檢查自己,只需使用['std :: array :: at()'](http://en.cppreference.com/w/cpp/container/array/at) –