Comment faire pour déterminer le type d'une variable?
je veux trouver le type d'une Variable (la variable est donnée par un paramètre du Modèle, donc je ne sais pas ce que c'est).
#include <iostream>
#include <typeinfo>
int main()
{
double test;
std::cout << typeid(test).name() << std::endl;
}
Mais le Code ne dégage que:
$./test
d
mais j'aurais besoin de la double à la place.
Le point est, je ne sais pas quel type d'attendre, mais je dois l'écrire dans un sous-programme, qui as pour être compilé. Donc, d est une mauvaise idée.
- Si c'est un paramètre du modèle, n'est-ce pas le paramètre le type lui-même?!
- Il n'y a pas moyen de faire ce que vous voulez. Le nom de la représentation est définie par l'implémentation, et IIRC la mise en œuvre est permis de ne pas fournir une représentation à tous. Tout ce qui était dans le cas de types polymorphes seulement, bonne chance avec les types polymorphes.
- Ma conjecture est que vous voulez faire quelque chose que vous n'avez pas expliqué. Pourquoi avez-vous besoin le type de nom? Je suis assez sûr qu'il y est un moyen de résoudre votre problème réel, plutôt que celui que vous avez demandé.
- Vous devriez vraiment utiliser un exemple qui illustre votre problème. Dans l'exemple il n'y a pas n'importe quel modèle de paramètres, les principaux problèmes que vous voulez résoudre, n'est pas expliqué par l'exemple...
- Je reçois l'essai par l'intermédiaire de modèle, donc je ne sais pas de quel type il est. Quelque chose comme template<test> ... j'ai utiliser le type de l'information plus tard lors de la compilation d'un opencl programme qui dans ce cas doit être fait au moment de l'exécution.
- En regardant 5.2.8/3 dans mon projet de C++0x Standard, on dirait que vous êtes censé recevoir un
std::type_info
objet pour les non-polymorphe aussi des types. Bien sûr, pas tous les compilateurs de mettre en œuvre tous les détails de la Norme encore, etname()
renvoie quelque chose de la mise en œuvre définies. - Si vous obtenez le type d'un paramètre du modèle que vous avez déjà le type là, n'est-ce pas?
Vous devez vous connecter pour publier un commentaire.
Dans GNU ABI, il y a un de l'aide pour demangle la
name()
d'untypeid
std::free
?)std::*
(cependant, y compris<cstdlib>
ne permet de définir : libre sans le demander). De toute façon, fixe l'échantillon dans l'autre sens, pas besoin d'embrouiller les gens avec c++0x qui ne sont pas nécessaires ici 🙂Si vous connaissez la liste des types qui doit être pris en charge, vous pouvez écrire votre propre fonction pour ce faire:
Avis que, puisque la fonction n'est pas un argument de type T, il doit toujours avoir le type a clairement dit:
et bien sûr, le type peut être un type de paramètre:
Vous pouvez essayer de forcer une erreur dans un modèle avec cette expression comme argument, et le message d'erreur compilateur aura le type que vous recherchez.
Par exemple, à l'aide de GCC:
Donc les types de sous-évaluées sont
double
,int
etstd::_Rb_tree_iterator<std::pair<const std::basic_string<char>, int> >
.La première surcharge est non-const, ce qui signifie que l'expression est un non-const l-valeur.
L'astuce de
sizeof(t)==0
est nécessaire pour rendre l'ensemble de l'expression dépend du paramètre du modèle, et de retarder l'erreur jusqu'à ce que l'instanciation. L'erreur elle-même (la taille du tableau est négatif) est, bien sûr, pas de sens.Et si vous êtes à l'aide de C++11, vous pouvez améliorer:
Comme un bonus supplémentaire, qui peut faire une différence entre const l-valeurs et r-valeurs. Le premier est un
double
l-valeur, la seconde unconst double
l-valeur et les deux autres sont des valeurs r.Source: http://www.cplusplus.com/doc/tutorial/typecasting/
Mon produit par GCC noms déformés. E. g. d pour
double
, j'ai pourint
, c pourchar
et St6vectorIiSaIiEE pourstd::vector<int>
À partir de GCC typeinfo:
--edit--
Vous ne pouvez pas "renouvelable" obtenir le nom à travers les compilateurs. Si vous voulez faire exactement ce que vous devez coder en dur un peu comme John Gorden décrit dans son post.