8
votes

C ++ Typename de la variable de membre

est-il possible d'obtenir la typename d'une variable de membre? Par exemple: xxx

merci


0 commentaires

4 Réponses :


1
votes

Peut ne pas être exactement ce que vous recherchez, mais une solution éventuellement meilleure à long terme: xxx

Ce n'est pas exactement ce que vous voulez, mais cela nous permet de Masquer le type de mise en œuvre de C :: Valeur Pour que nous puissions le changer ultérieurement, ce que je soupçonne que vous êtes après.


3 commentaires

Malheureusement, je ne contrôle pas la structure, qui provient de la bibliothèque externe et de ne pas avoir de valeur_type ou d'équivalent


Est-il possible alors qu'il n'est pas censé être accessible?


@stefanb Bibliothèque (Cuda) a une interface C. J'essaie de le rendre approprié pour le code de modèle.in principe, je peux écrire des traits de type si rien d'autre ne fonctionne.



5
votes

Seulement si vous êtes bien avec le traitement du type dans une fonction xxx

il ne fonctionnera pas avec les membres de données de référence. C ++ 0x permettra déclinger (C :: Value) pour le faire plus facilement. Non seulement cela, mais cela permet déclinger (c :: valeur + 5) et toute autre truc d'expression fantaisie dans le déclinger . GCC4.5 le soutient déjà.


7 commentaires

Je suppose que c'est le meilleur moment pour demander. Savez-vous pourquoi ils ont choisi déclinger sur typeof ? typeof est "correspondant" Tailleof , déclinger est laid et ne lit pas aussi! :(


@Gman - Dessinaison aléatoire: car de nombreux compilateurs utilisent probablement typeof comme une extension spécifique au compilateur, et l'introduisant comme un mot-clé briserait probablement beaucoup de code, comme le type de type standard de "code> > serait inévitablement différent du type spécifique au compilateur de .


@Gman J'ai le même soupçon que Chris - je pense que c'est en grande partie une question de compatibilité. AS l'exemple, déclinger (c :: valeur) sera un type différent de celui de déclinger ((valeur C :: valeur)) . Mes tests idiotes indiquent que typeof sur gcc int dans les deux cas.


@Chris et litb: Ah, cela a du sens. Puis-je demander pourquoi ce serait des types différents et ce qu'ils sont? C'est terriblement déroutant.


@Gman je suis d'accord, les règles sont déroutant, j'ai bien peur :) Si vous avez un accès aux membres de la classe (PTR-> MEM ou obj.mem) ou une expression d'identité (qualifiée ou non qualifiée Nom, comme C :: Valeur ou Valeur) comme opérande, alors déclinger donnera le type de cette entité. Par exemple, une référence produira un type de référence. Si ce n'est pas le cas, si l'opérande est un appel de fonction (éventuellement parenthèses) ou un appel implicite à un opérateur surchargé, alors déclinger donnera le type de retour de celui-ci (donc int const f ( ) et déclinger (f ()) rendements int const ). ...


Sinon, vous obtenez le type de l'expression, mais comme référence si l'expression est une lvalue. Donc, si l'opérande est (c :: valeur) au lieu de c :: valeur vous obtenez int & . Pour l'exemple d'appel de la fonction, si l'opérande est déclinger (0, f ()) vous obtenez int (car les rapales de type non de classe ne sont pas qualifiés de Const). J'espère que cela effraye la question.


Yeesh D: On dirait que j'ai une lecture à faire. Merci d'avoir expliqué cela.



9
votes

pas en C ++ 03. C ++ 0x introduit déclenle : xxx

Certains compilateurs ont un typeof extension, cependant: xxx < / Pré>

Si vous allez bien avec Boost, ils ont un bibliothèque pour celui-ci: xxx


1 commentaires

Travaille pour moi. Assurez-vous de ne pas désactiver les extensions avec un commutateur.



0
votes

Cela dépend de ce que vous devez faire, mais vous feriez quelque chose comme: xxx


0 commentaires