关于工会的问题,因为我很少使用它们。
我使用联合表示rgb像素数据,因此可以将其作为uint8_t
的连续数组或作为单个rgb元素进行访问。 (我认为这可能是工会的少数用途之一。)
类似这样的东西:
union PixelRGB
{
uint8_t array[3];
struct rgb
{
uint8_t b;
uint8_t g;
uint8_t r;
};
};
我已经意识到能够在像素数据上应用“和”和“或”之类的操作会很好。我想做类似的事情
PixelRGB::operator&=(const PixelRGB other)
{
this->rgb.r = other.r;
this->rgb.g = other.g;
this->rgb.b = other.b;
}
我尝试将这样的运算符放到联合中,但据我所知,C ++不允许这样做。 (编译时也会出现编译器错误-因此,我认为这是不允许的。)
我考虑过的一种可能的解决方案是将联合包装在一个类中,然后向该类添加运算符。但是,这对于命名空间/名称范围来说有点不愉快。
还有其他解决方案吗?
答案 0 :(得分:3)
您可以在联合体内定义运算符,
union PixelRGB {
...
PixelRGB& operator&=(const PixelRGB& other) {
return *this;
}
};
或在外部
PixelRGB& operator&=(PixelRGB& self, const PixelRGB& other) {
return self;
}
答案 1 :(得分:0)
问题不在于操作员,而是访问联合的方式。您可以尝试以下组合:
union PixelRGB
{
uint8_t array[3];
struct {
uint8_t b;
uint8_t g;
uint8_t r;
};
};
PixelRGB& operator&=(PixelRGB& self, const PixelRGB& other) {
self.r = other.r;
self.g = other.g;
self.b = other.b;
return self;
}
或者这个:
union PixelRGB
{
uint8_t array[3];
struct {
uint8_t b;
uint8_t g;
uint8_t r;
};
PixelRGB& operator&=( const PixelRGB& other) {
r = other.r;
g = other.g;
b = other.b;
return *this;
}
};
或者这个:
union PixelRGB
{
uint8_t array[3];
struct {
uint8_t b;
uint8_t g;
uint8_t r;
};
PixelRGB& operator&=( const PixelRGB& other);
};
PixelRGB& PixelRGB::operator&=( const PixelRGB& other) {
r = other.r;
g = other.g;
b = other.b;
return *this;
}
注意: C11中引入了匿名结构
https://en.cppreference.com/w/c/language/struct
,但是即使多个编译器都支持,它也不是C ++中的标准。