一个包含int的不同字节的类吗?

时间:2019-01-03 14:34:56

标签: c++ int bit unions

我想提出一个Record类,其中包含一个int,但是它可以是int64_tint32_tint16_t,{ {1}}。
但是当我想从该int8_t对象中读取数据时遇到了问题。


在我们的上下文中的假设:
我们知道要保存哪个Record
我们必须注意int这样的功能的性能和这样的类或联合的 size

我会尝试在上下文中执行3次(非常虚拟)。
1.第一个实现:

getValue()

我会尝试调用class Record{ int64_t value; unsigned int bytes; // number of bytes, in context 1 or 2 or 3 or 4 representing int8_t, int16_t, int32_t, int64_t int64_t getValue() { return value; } unsigned int getNumByte() { return bytes; } } getValue(),然后将值转换为正确的类型,例如getNumByte()


2。第二:使用if (getNumByte() == 1) auto value = (int8_t getValue())

template

3。第三:使用template <class T> class Record{ T value; T getValue() { return value; } }

union

我的问题:
在这种情况下,哪种实现更好?
当它们都不是那么理想时,您会想出哪种方法?


此问题的原因:这是union Record { int64_t int64; int32_t int32; int16_t int16; int8_t int8; }; 的{​​{1}}。因此,在这种情况下,Recordchar*才有意义。我想切换到char* value的情况,并遇到此问题。

1 个答案:

答案 0 :(得分:2)

模板是最佳的,因为它始终与基础类型相同,并且将被优化。一些小的变化。

template <class T> 
class Record {
    T value;
  public:
    const T& getValue() const { return value; }
}

但是,此解决方案不允许您使用具有不同模板参数的Records容器,并且使序列化/反序列化代码更难使用。

此外,如果该代码对您有用,那么请问自己“记录”的作用是什么?我只会使用基础类型本身。