Я хотел бы придумать класс Record
, который содержит int
, но это может быть int64_t
, int32_t
, int16_t
, int8_t
.
Но у меня возникла проблема, когда я хочу прочитать данные из этого Record
объекта.
Предположение в нашем контексте:
Мы знаем, какой int
мы хотим сохранить.
Мы должны заплатитьобратите внимание на производительность из getValue()
такой функции и размер такого класса или объединения.
Я бы попробовал 3 реализации в контексте (очень пустышки).
1. Первая реализация:
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()
, а затем привести значение к правильному типу, например if (getNumByte() == 1) auto value = (int8_t getValue())
.
2.Second: Использование template
.
template <class T>
class Record{
T value;
T getValue() { return value; }
}
3.Third: Использование union
:
union Record {
int64_t int64;
int32_t int32;
int16_t int16;
int8_t int8;
};
Мой вопрос:
Что касается этого контекста, какая реализация лучше?
Когда все они не настолько оптимальны, какой подход вы бы придумали?
Причина дляэтот вопрос: это был Record
за char*
.Таким образом, в этой ситуации char* value
с unsigned int length
имеет смысл.Я хочу переключиться на ситуацию int
и у меня возникла эта проблема.