C ++中的位域编译是依赖于实现的 - 如果效率更高,它们可能无法按预期编译。不幸的是,当处理要求精确组织位域的严格标准时(例如在设备之间传输数据时),这是不可取的。我试图在联合中使用更精确的位域结构:
template< unsigned char BIT_COUNT , unsigned char OFFSET >
struct Bitfield
{
protected:
unsigned char data;
// Get and Set Functions
public:
operator unsigned char () const
{
return ( data >> OFFSET ) & ( ( 1 < BIT_COUNT ) -1 );
}
Bitfield& operator = ( unsigned char value )
{
const unsigned char mask = ( ( 1 << BIT_COUNT ) - 1 ) << OFFSET;
data &= ~mask;
data |= ( value << OFFSET ) & mask;
return *this;
}
};
union Bitfield_Test
{
Bitfield< 8 , 0 > raw;
Bitfield< 4 , 0 > flagset_1;
Bitfield< 1 , 0 > flag_a;
Bitfield< 1 , 1 > flag_b;
Bitfield< 1 , 2 > flag_c;
Bitfield< 1 , 3 > flag_d;
Bitfield< 4 , 4 > flagset_2;
Bitfield< 1 , 4 > flag_w;
Bitfield< 1 , 5 > flag_x;
Bitfield< 1 , 6 > flag_y;
Bitfield< 1 , 7 > flag_z;
};
void Test()
{
Bitfield_Test test1;
test1.raw = 1 << 6;
test1.flag_a = 1;
Bitfield_Test test2;
test2.raw = 0;
test2.flag_a = test1.flag_a = 1;
}
不幸的是,在将数据从一个工会成员传输到另一个工会成员时,我的解决方案没有按预期运行。它将整个联合设置为另一个的值,而不仅仅是其成员。我怀疑罪魁祸首是默认的复制构造函数。不幸的是,即使没有定义任何实现,联合也不会允许覆盖复制构造函数的结构作为成员。
是否有任何技巧或黑客可以阻止在此实例中编译默认的复制构造函数?