Comment puis-je obtenir le type d’une variable?

En C ++, comment trouver le type d’une variable?

Vous pouvez utiliser l’opérateur de typeid :

#include  ... cout << typeid(variable).name() << endl; 

Pour une insertion statique, C ++ 11 a introduit decltype qui est très utile dans certains scénarios.

Généralement, vouloir trouver le type d’une variable en C ++ est une mauvaise question. Cela a tendance à être quelque chose que vous emportez des langages procéduraux comme par exemple C ou Pascal.

Si vous souhaitez coder différents comportements en fonction du type, essayez de vous renseigner sur, par exemple , la surcharge de fonctions et l’ inheritance d’objects . Cela n’a pas de sens immédiat lors de votre premier jour de C ++, mais continuez.

Si vous avez une variable

 int k; 

Vous pouvez obtenir son type en utilisant

 cout << typeid(k).name() << endl; 

Voir le fil de discussion suivant sur SO: Question similaire

La principale différence entre C ++ et Javascript est que C ++ est un langage statique, et que java JavaScript est dynamic.

Dans les langages typés dynamics, une variable peut contenir n’importe quelle chose, et son type est donné par la valeur qu’il contient, à chaque instant. Dans les langages typés statiques, le type d’une variable est déclaré et ne peut pas être modifié.

Il peut y avoir une composition dynamic des objects et des sous-types (inheritance et fonctions virtuelles), ainsi que la répartition statique et le sur-typage (via le modèle CRTP), mais le compilateur doit toujours connaître le type de la variable.

Si vous êtes en position de ne pas savoir ce que c’est ou pourrait être, c’est parce que vous avez conçu quelque chose car le langage a un système de type dynamic.

Si tel est le cas, il vaut mieux repenser votre conception, car celle-ci se déroule dans un pays qui n’est pas naturel pour la langue que vous utilisez (comme si vous alliez sur une autoroute avec une chenille ou dans l’eau avec une voiture)

Je ne suis pas sûr si ma réponse serait utile.

La réponse courte est que vous n’avez pas vraiment besoin / ne voulez pas connaître le type de variable à utiliser.

Si vous devez donner un type à une variable statique, vous pouvez simplement utiliser auto.

Dans les cas plus sophistiqués où vous voulez utiliser “auto” dans une classe ou une structure, je vous suggère d’utiliser template avec decltype.

Par exemple, si vous utilisez la bibliothèque de quelqu’un d’autre et que celle-ci a une variable appelée “unknown_var” et que vous souhaitez la placer dans un vecteur ou une structure, vous pouvez le faire entièrement:

 template  struct my_struct { int some_field; T my_data; }; vector complex_vector; vector > simple_vector 

J’espère que cela t’aides.

EDIT: Pour faire bonne mesure, voici le cas le plus complexe auquel je puisse penser: avoir une variable globale de type inconnu. Dans ce cas, vous avez besoin de c ++ 14 et de variable de modèle.

Quelque chose comme ça:

 template vector global_var; void random_func (auto unknown_var) { global_var.push_back(unknown_var); } 

C’est quand même un peu fastidieux mais c’est aussi proche que possible des langages sans typage. Assurez-vous que chaque fois que vous référencez une variable de modèle, placez toujours la spécification du modèle.

Je crois que j’ai un cas d’utilisation valable pour utiliser typeid (), de la même manière que l’utilisation de sizeof () est valide. Pour une fonction de modèle, j’ai besoin de cas particulier le code basé sur la variable de modèle, de manière à offrir un maximum de fonctionnalités et de flexibilité.

Il est beaucoup plus compact et facile à gérer que le polymorphism, pour créer une instance de la fonction pour chaque type pris en charge. Même dans ce cas, je pourrais utiliser cette astuce pour écrire le corps de la fonction une seule fois:

Notez que, comme le code utilise des modèles, l’instruction switch ci-dessous doit être résolue statiquement dans un seul bloc de code, optimisant ainsi tous les faux cas, AFAIK.

Considérons cet exemple, où il peut être nécessaire de gérer une conversion si T est un type vs un autre. Je l’utilise pour la spécialisation de classe pour accéder au matériel où le matériel utilisera le type myClassA ou myClassB. En cas d’incompatibilité, je dois passer du temps à convertir les données.

 switch ((typeid(T)) { case typeid(myClassA): // handle that case break; case typeid(myClassB): // handle that case break; case typeid(uint32_t): // handle that case break; default: // handle that case } 
 #include  ... ssortingng s = typeid(YourClass).name()