J'ai une petite question: comment découvrir quel pointeur de type A C ++ est?
J'utilise souvent une petite fonction dans mes programmes de console pour recueillir des entrées, ce qui ressemble à ceci: P>
void query(string what-to-ask, [insert datatype here] * input)
7 Réponses :
Si je comprends ce que vous demandez, alors la façon habituelle est de créer une classe d'interface prenant en charge la requête (chaîne what-tok) code>, puis au lieu d'utiliser un pointeur vide Il suffit de passer un pointeur à l'interface. Ensuite, vous pouvez appeler la requête () sur cette instance. P>
Vous ne pouvez pas.
Cependant, une alternative consiste à supprimer des pointeurs de vide, faites tout résulter d'une classe de base commune et utilisez RTTI. P>
Exemple: P> < Pré> xxx pré> p>
Sachez que dynamic_cast peut être très lent - facilement une chair de microseconde, pour toutes les hiérarchies de classe plus grandes que triviales.
Nope. Vous ne pouvez pas faire cela. Si vous avez besoin de quelque chose comme ça, je vous suggère Boost.any a>. p>
vous pourrait em> programme votre code avec l'utilisation de void * code> est la formulaire tous les données em> ont. Vous ne pouvez pas "déterminer" IT - IT est em>. Toutes les données que vous avez dans le programme sont em>
void * code>! Oui, ils sont des morceaux crus de mémoire, par designs. P>
vide * code> uniquement. Heureusement, la langue C fournit un supplément commodité em> à vous, vous permettant de manipuler certaines données comme elles n'étaient pas
Void * Code>. Mais si vous allez utiliser cette commodité, vous ne devez pas les jeter à
Void * CODE> et oubliez quel type ils étaient. P>
Tous les pointeurs sont nuls *. La dernière fois que j'ai vérifié, un caractère n'est pas nul *. Un int pourrait ne pas être annulé *. Un flotteur n'est pas nul *. Mais char *, int * et flotteur * sont.
Son argument est que toutes les données ne sont rien d'autre que des octets en mémoire. Ints, caractères, chaînes, etc. ne sont que des interprétations.
Votre question n'est pas du tout clair pour moi, mais peut-être ce que vous voulez, c'est de surcharger Query code>
Plus un pour la simplicité et la clarté
Si vous contrôlez le type de données vous-même, je ferais probablement une classe / des struct qui contient une énumération de tous les types de données que vous vous souciez et de passer cela. Vous pouvez ensuite interroger le voyeur transmis dans le type de données, puis jeté de manière appropriée.
IE (AVERTISSEMENT DE PSUDED CODE - TRAITER CETTE COMME UN STRUCTURE POUR MAINTENANT.) P>
class MyDataType { enum aDataType type; void * myData; } void query( string whatToAsk, MyDataType * pdata) { switch ( pdata.type) { case integer: int * workInt = (int * ) pdata; do whatever you want to to get the data break; case someFunkyObject: someFunkyObject pob = (SomeFunkyObject *) pdata; Do whatever you want with the data. etc. } }
Si je marquais avec Enums (plutôt que d'utiliser RTTI), je serais plus enclin à faire "myData" une union au lieu d'un vide * ... Moins de pointeurs de cette façon, et pas de double indirection. Bien que ce soit beaucoup plus de style C que c ++.
au lieu de passer un Ceci Comment obtenir le code de sécurité et ne pas avoir à écrire un code spécial pour la plupart des types d'entrée: p> void * code> autour de celui que vous devez ensuite utiliser au type correct, vous devez probablement utiliser une fonction de modèle pouvant être utilisée avec tous les types que vous souhaitez lire.
Vous le jetez et croisez vos doigts.
Regardez comment la fonction C natif C
scanf () code> les gère.
Une question: voulez-vous que l'utilisateur puisse taper quelque chose et que vous voulez l'analyser en conséquence? Disons-nous-en-jour, alors vous voulez un "INT", ou 15.4 vous voulez un flotteur? C'est ça?
Bruno, non, je veux transmettre n'importe quel type de données. L'utilisateur entrera dans le type de données que j'ai entré. Comme un modèle, que je suppose, c'est ma meilleure solution.