我想提出一个Record
类,其中包含一个int
,但是它可以是int64_t
,int32_t
,int16_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}}。因此,在这种情况下,Record
和char*
才有意义。我想切换到char* value
的情况,并遇到此问题。
答案 0 :(得分:2)
模板是最佳的,因为它始终与基础类型相同,并且将被优化。一些小的变化。
template <class T>
class Record {
T value;
public:
const T& getValue() const { return value; }
}
但是,此解决方案不允许您使用具有不同模板参数的Records容器,并且使序列化/反序列化代码更难使用。
此外,如果该代码对您有用,那么请问自己“记录”的作用是什么?我只会使用基础类型本身。