10
votes

Rechercher Type de pointeur vidien C ++

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)


4 commentaires

Vous le jetez et croisez vos doigts.


Regardez comment la fonction C natif C scanf () 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.


7 Réponses :


0
votes

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) , 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.


0 commentaires

12
votes

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.

Exemple: < Pré> xxx


1 commentaires

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.



0
votes

Nope. Vous ne pouvez pas faire cela. Si vous avez besoin de quelque chose comme ça, je vous suggère Boost.any .


0 commentaires

2
votes

void * est la formulaire tous les données ont. Vous ne pouvez pas "déterminer" IT - IT est . Toutes les données que vous avez dans le programme sont void * ! Oui, ils sont des morceaux crus de mémoire, par designs.

vous pourrait programme votre code avec l'utilisation de vide * uniquement. Heureusement, la langue C fournit un supplément commodité à vous, vous permettant de manipuler certaines données comme elles n'étaient pas Void * . Mais si vous allez utiliser cette commodité, vous ne devez pas les jeter à Void * et oubliez quel type ils étaient.


2 commentaires

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.



2
votes

Votre question n'est pas du tout clair pour moi, mais peut-être ce que vous voulez, c'est de surcharger Query xxx


1 commentaires

Plus un pour la simplicité et la clarté



1
votes

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.
    }
}


1 commentaires

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 ++.



6
votes

au lieu de passer un void * 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.

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: xxx


0 commentaires