D'accord, j'ai une bibliothèque que j'ai écrite en C qui lit un fichier et donne accès à ses données. Les données sont tapé, alors j'utilise pointeur vide et quelques fonctions accesseurs:Quel serait le meilleur moyen de conclure ce pointeur vide?
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;
}
Pour différents types (built-ins: TAG_BYTE (char
), TAG_SHORT (int16_t
), TAG_INT (int32_t
), TAG_LONG (int64_t
), TAG_FLOAT (float
), TAG_DOUBLE (double
), chaîne_étiquette (char *
) et quelques peu plus de types de données complexes, liste_balise (struct nbt_list
), TAG_COMPOUND (struct nbt_compound
), TAG_BYTE_ARRAY (struct nbt_byte_array
).
J'essaie maintenant pour mapper cela en C++ d'une manière élégante mais je peux t get it done ...
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
Cela se sent bien trop verbeux .. une meilleure façon?
Cela semble vraiment prometteur, merci! Mais cela fonctionnera-t-il quand 'getValue()' est un membre de la classe?J'ai oublié d'ajouter cela à la question, toutes ces fonctions font partie d'une classe 'Tag' – LukeN
@LukeN: Yep ça va. Les classes TypeTag peuvent être des classes membres de Tag ou externes à Tag de classe (je les ferais personnellement des classes privées de Tag). –
@LukeN: Notez que vous devez dans ce cas déclarer les spécialisations * en dehors de la classe, en tant que template <> vector Tag :: getValue () {...} '. –