Хорошо, у меня есть библиотека, которую я написал на C, которая читает файл и предоставляет доступ к его данным.Данные набираются, поэтому я использую указатель void и несколько функций доступа:
typedef struct nbt_tag
{
nbt_type type; /* Type of the value */
char *name; /* tag name */
void *value; /* value to be casted to the corresponding type */
} nbt_tag;
int64_t *nbt_cast_long(nbt_tag *t)
{
if (t->type != TAG_LONG) return NULL;
return (int64_t *)t->value;
}
Для разных типов (встроенные: TAG_BYTE (char
), TAG_SHORT (int16_t
), TAG_INT(int32_t
), TAG_LONG (int64_t
), TAG_FLOAT (float
), TAG_DOUBLE (double
), TAG_STRING (char *
) и несколько более сложных типов данных, TAG_List (struct nbt_list
), TAG_COMPOUND(struct nbt_compound
), TAG_BYTE_ARRAY (struct nbt_byte_array
).
Я сейчас пытаюсь изобразить это на C ++ элегантным способом, но не могу это сделать ...
char getByte(); // TAG_BYTE
int16_t getShort(); // TAG_SHORT
int32_t getInt(); // TAG_INT
int64_t getLong(); // TAG_LONG
float getFloat(); // TAG_FLOAT
double getDouble(); // TAG_DOUBLE
std::string getString(); // TAG_STRING
std::vector<char> getByteArray(); // TAG_BYTE_ARRAY
std::vector<Tag> getCompound(); // TAG_COMPOUND
Это кажется слишком многословным ... лучше?