一个通用类,用于解决联合体初始化问题

c++早期版本中,结构中的联合体,在初始化时,总有很多支持不佳的编译器,这儿提供一个通用类,用于实现联合体的初始化

class UnionValue {
private:
    union {
        uint8_t  value_u8_;
        uint16_t value_u16_;
        uint32_t value_u32_;
        int8_t   value_i8_;
        int16_t  value_i16_;
        int32_t  value_i32_;
        float    value_f_;
    } base_value_;

public:
    explicit UnionValue(uint8_t u8_)  {  base_value_.value_u8_ = u8_;}
    explicit UnionValue(uint16_t u16_){  base_value_.value_u16_ = u16_;}
    explicit UnionValue(uint32_t u32_){  base_value_.value_u32_ = u32_;}
    explicit UnionValue(int8_t i8_)   {  base_value_.value_i8_ = i8_;}
    explicit UnionValue(int16_t i16_) {  base_value_.value_i16_ = i16_;}
    explicit UnionValue(int32_t i32_) {  base_value_.value_i32_ = i32_;}
    explicit UnionValue(float f_)     {  base_value_.value_f_ = f_;}

    uint8_t  value_u8()  {return base_value_.value_u8_;}
    uint16_t value_u16() {return base_value_.value_u16_;}
    uint32_t value_u32() {return base_value_.value_u32_;}
    int8_t   value_i8()  {return base_value_.value_i8_;}
    int16_t  value_i16() {return base_value_.value_i16_;}
    int32_t  value_i32() {return base_value_.value_i32_;}
    float    value_f()   {return base_value_.value_f_;}
};

 

整个类定义简单,且不占用额外空间,使用时也不需要有额外的代码

示例结构体:

typedef struct Level_st {
    uint8_t  prior_;     // 优先顺序顺序
    uint8_t  type_;      // 数值类型:0 - bool/1 - uint8_t/2 - uint16_t/3 - uint32_t/4 - uint8_t/5 - uint16_t/6 - uint32_t/7 - float
    uint32_t offset_;    // 偏移
    UnionValue base_value_;
}Level_st ;

初始化代码如下:

Level_st override_level[] = {
    {0, 3, 2,   UnionValue(uint32_t(0))},
    {1, 7,  2,  UnionValue(0.95f)},
};

 

posted @ 2021-01-05 19:16  日月王  阅读(340)  评论(0编辑  收藏  举报