36 votes

Y a-t-il des cas où un typedef est absolument nécessaire?

Considérez l'extrait suivant de l' idiome safe bool :

 typedef void (Testable::*bool_type)() const;
operator bool_type() const;
 

Est-il possible de déclarer la fonction de conversion sans le typedef? Ce qui suit ne compile pas:

 operator (void (Testable::*)() const)() const;
 

9voto

FredOverflow Points 88201

Ah, je viens de me souvenir de la méta-fonction identity . Il est possible d'écrire

 operator typename identity<void (Testable::*)() const>::type() const;
 

avec la définition suivante de identity :

 template <typename T>
struct identity
{
    typedef T type;
};
 

Vous pourriez argumenter que identity utilise toujours un typedef , mais cette solution est assez "bonne" pour moi.

3voto

Keith Thompson Points 85120

Un cas (non lié à votre question) où un typedef est requis est lorsqu’on utilise le

va_arg() macro. Citant la norme C99 (7.15.1.1):

type * va_arg (va_list ap, type );

...

Le type de paramètre doit être un nom de type spécifié de sorte que le type d'un pointeur sur un objet ayant le type spécifié puisse être obtenu simplement en postfixant un * pour le type

2voto

Ajay Points 5320

Mon analyse est dit qu'il n'est pas possible sans l'aide d' typedef. Le compilateur voit ( comme le premier jeton et suppose que vous surcharger () operator, ce qui ne devrait pas avoir d'arguments (Les arguments pourraient venir dans les prochains jeu de parenthèses). Mettre tout ensemble de parenthèse supplémentaires ne serait pas de l'aide, soit - mais effectivement confondre le compilateur et donc plus d'erreurs.

La plupart du code STL est sur le dessus de l' typedefinitions, et on devrait/doit utiliser!

2voto

n.m. Points 30344

Il semble que la grammaire exige l'utilisation d'un typedef dans votre cas. Un identificateur de fonction de conversion doit être de l' opérateur de formulaire id-type-conversion . L' identificateur de type de conversion ne peut pas contenir de parenthèses. Vous devez donc utiliser typedef lors de la conversion en un type pointeur à fonction ou en type pointeur à membre.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X