Trouver le Type de C++ Void Pointeur
J'ai une petite question: comment puis-je savoir quel est le type d'un pointeur C++ est?
J'utilise souvent une petite fonction dans mes programmes de la console afin de recueillir des commentaires, qui ressemble à quelque chose comme ceci:
void query(string what-to-ask, [insert datatype here] * input)
Je voudrais créer un formulaire générique, à l'aide d'un pointeur void, mais je ne peux pas cin un vide pointeur, donc comment puis-je trouver ce genre, donc je peux le jeter?
- Vous le lancez et croiser les doigts.
- Regardez comment le natif de fonction C
scanf()
gère. - Une question: voulez-vous que l'utilisateur soit capable de taper dans quelque CHOSE et que vous voulez analyser en conséquence? Disons qu'il types 14, alors vous voulez un "int", ou 15,4 vous voulez un float? Qui est-ce?
- Bruno, non , je veux PASSER n'importe quel type de données, puis l'utilisateur entrez le type de données que j'ai entré. Comme un modèle, qui je pense est mon meilleur solution.
Vous devez vous connecter pour publier un commentaire.
Il a été un long temps depuis la dernière fois que j'ai codé en C++, mais...
Ne pouvez-vous pas utiliser un Modèle?
Vous ne pouvez pas.
Cependant, une alternative est de faire disparaître avec le vide des pointeurs, faire tout ce qui dérivent d'une classe de base commune et de l'utilisation de RTTI.
Un exemple:
dynamic_cast<Foo*>
Au lieu de passer un
void*
autour de vous alors besoin de cast vers le type est correct, vous devriez probablement utiliser une fonction de modèle qui peut être utilisé avec tous les types que vous voulez lire.Cette façon, vous obtenez un code de type sécurisé et ne pas avoir à façon d'écrire le code spécial pour la plupart des types d'entrée:
void*
est la forme tous données. Vous ne pouvez pas "déterminer" -- il est, toutes les données que vous avez dans le programme sontvoid*
! Oui, ils sont crus des morceaux de mémoire, de par leur conception.Vous pourrait programme d'ensemble de votre code avec l'utilisation de
void*
seulement. Heureusement, le langage C fournit d'autres commodité à vous, vous permettant de manipuler des données, c'est qu'ils n'ont pas étévoid*
. Mais si vous allez utiliser cette commodité, vous ne devriez pas jeter àvoid*
et d'oublier au sujet de quel type ils sont.Votre question n'est pas du tout clair pour moi, mais peut-être ce que vous voulez, c'est la surcharge de
query
Si je comprends ce que vous me demandez ensuite de la manière habituelle pour ce faire est de créer une interface de classe qui prend en charge
query(string what-to-ask)
et puis au lieu d'utiliser un pointeur void juste de passer un pointeur vers l'interface. Ensuite, vous pouvez appeler query() sur l'instance.Nope. Vous ne pouvez pas faire cela. Si vous besoin de quelque chose comme cela, je suggère Coup de pouce.Tout.
Si vous pouvez contrôler le type de données vous-même, je serais probablement faire un class/struct qui contient une énumération de tous les types de données que vous aimez et laissez-passer qui. Vous pourriez ensuite d'interroger le passé dans un pointeur pour qu'il est du type de données, puis coulé de façon appropriée.
IE ( pseudo-code de l'avertissement de la traiter comme une structure pour l'instant. )
Vous avez pu lire dans un char * et ensuite d'analyser la chaîne de caractères (char par char) afin de déterminer si c'est un int, float, string, que ce soit. La partie difficile est de le convertir.
Par exemple:
pour chaque caractère dans la chaîne
si le caractère est un '.')
++decimalcount
else if (caractère est une lettre)
++lettercount
fin de boucle
si decimalcount > 0 && lettercount == 0
analyser chaque chiffre de droite à gauche, la multiplication par des puissances de 10 et en ajoutant la somme
d'autre si decimalcount == 1 && lettercount == 0
apprendre les flotteurs sont représentés en binaire et trouver quelqu'un d'autre fonction pour convertir pour vous
d'autre si lettercount > 0
c'est une chaîne. yay!!!
void *
ou de tout autre arbitraire pointeur réinterprété commechar *
, puisque, bien sûr, toute l'arithmétique type de coïncidence contiennent des octets qui ont le même modèle de bits que [insérez votre favori de caractères ASCII ici]. Outre la récupération de données/forensics, il n'y a pas de point d'essayer de jouer au devinettes avec des pointeurs déréférencés. Je ne dis pas que vous êtes, mais c'est une des interprétations de l'OP de la question, de sorte qu'il porte l'accentdans la mesure du possible, éviter les pointeurs void, utiliser des modèles. Je suis récemment à la recherche d'une énorme base de code avec beaucoup de void *, elle est très coûteuse en temps.