 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
Falk Tannhäuser Guest
|
Posted: Thu Apr 01, 2004 9:10 am Post subject: Re: Spécialisation de patrons pour typesénumérés |
|
|
Guillaume LEMAÎTRE wrote:
| Quote: |
Bonjour,
Existe-t-il un moyen d'écrire des spécialisations de structures/classes
pour l'ensemble des types énumérés comme on peut le faire pour les
pointeurs, etc. ?
En quelque sorte quelque chose comme :
template< typename T > struct A { /* ... */ };
template< typename T > struct A< enum T > { /* ... */ };
La bibliothèque Boost <http://www.boost.org> semble permettre de tester |
si un type T est un 'enum', cf. "::boost::is_enum<T>::value" sur la page
<http://www.boost.org/libs/type_traits/index.html>.
Je m'en suis encore jamais servi...
Falk
|
|
| Back to top |
|
 |
Guillaume LEMAÎTRE Guest
|
Posted: Thu Apr 01, 2004 6:09 pm Post subject: Re: Spécialisation de patrons pour types énumérés |
|
|
Falk Tannhäuser wrote:
| Quote: | Guillaume LEMAÎTRE wrote:
Bonjour,
Existe-t-il un moyen d'écrire des spécialisations de structures/classes
pour l'ensemble des types énumérés comme on peut le faire pour les
pointeurs, etc. ?
En quelque sorte quelque chose comme :
template< typename T > struct A { /* ... */ };
template< typename T > struct A< enum T > { /* ... */ };
La bibliothèque Boost <http://www.boost.org> semble permettre de tester
si un type T est un 'enum', cf. "::boost::is_enum<T>::value" sur la page
http://www.boost.org/libs/type_traits/index.html>.
Je m'en suis encore jamais servi...
Falk
|
Je vais regarder comment c'est implémenté
Merci beaucoup pour ce lien !
Guillaume
|
|
| Back to top |
|
 |
Loïc Joly Guest
|
Posted: Sun Apr 04, 2004 8:08 pm Post subject: Re: Spécialisation de patrons pour types énumérés |
|
|
Guillaume LEMAÎTRE wrote:
| Quote: | Falk Tannhäuser wrote:
Guillaume LEMAÎTRE wrote:
Bonjour,
Existe-t-il un moyen d'écrire des spécialisations de structures/classes
pour l'ensemble des types énumérés comme on peut le faire pour les
pointeurs, etc. ?
|
[...]
| Quote: | La bibliothèque Boost <http://www.boost.org> semble permettre de tester
si un type T est un 'enum', cf. "::boost::is_enum<T>::value" sur la page
http://www.boost.org/libs/type_traits/index.html>.
Je m'en suis encore jamais servi...
Je vais regarder comment c'est implémenté
Merci beaucoup pour ce lien !
|
Je ne sais pas trop si tu as pu comprendre à partir du code...
Par contre, dans le livre C++ Templates, the complete guide, ils
décrivent coment ce genre de chose peut être réalisé, et ce n'est pas
trivial. En voici l'idée (âmes sensibles s'abstenir):
Déjà, on suppose que l'on dispose des templates permettant de vérifier
si un type est un pointeur, une réference,... (ceux-là sont assez
simmples à écrire)
Ensuite, on se dit qu'une caractèristique des enum est de pouvoir se
convertir en int. D'autres type peuvent aussi le faire :
- Les entiers, références vers un entier...
- Les pointeurs, ref vers un pointeur...
- Les types avec une conversion définie par l'utilisateur
Pour les deux premiers points, on teste explicitement : si c'est le cas,
is_enum retourne faux.
Pour le troisième, c'est plus subtil. En gros, le principe n'est pas de
tester une simple conversion vers int, mais une conversion vers un type
qui pourra (de manière définie par l'utilisateur) être converti en int.
Comme une seule conversion implicite définie par l'utilisateur est
possible, et non pas deux d'affilée, ce type sera éliminé.
Enfin, l'idée pour tester la convertibilité : on définie une fonction
surchargée, une surcharge prend un paramètre de type '...' et l'autre de
type int. Les deux surchages retournent des types de taille différents,
et on teste les possibilités de conversion en int en faisant un sizeof
du type de retour de la fonction "appelée" (comme c'est dans un sizeof,
la fonction n'est pas appelée, mais la résolution de surcharge a lieu)
sur le type voulu.
Ya encore 2/3 subtilités, mais l'essentiel est là.
C'est vraiment tordu, et je quand je l'ai découvert, j'ai été surpris,
émerveillé et horrifié par ce qu'on pouvait obtenir d'un compilateur C++
sous la torture. Vivement un véritable système d'introspection, plutôt
que ces astuces barbares.
--
Loïc
|
|
| Back to top |
|
 |
Fabien LE LEZ Guest
|
Posted: Sun Apr 04, 2004 9:08 pm Post subject: Re: Spécialisation de patrons pour types énumérés |
|
|
On Sun, 04 Apr 2004 22:08:06 +0200, Loïc Joly
<loic.actarus.joly (AT) wanadoo (DOT) fr> wrote:
| Quote: | C'est vraiment tordu
|
Mais est-ce fiable ? Notamment, est-ce que ce genre de méthode (qui
procède par élimination) est à l'abri d'un éventuel nouveau type
défini par la prochaine norme C++ ?
--
;-)
|
|
| Back to top |
|
 |
Loïc Joly Guest
|
Posted: Sun Apr 04, 2004 9:39 pm Post subject: Re: Spécialisation de patrons pour types énumérés |
|
|
Fabien LE LEZ wrote:
| Quote: | On Sun, 04 Apr 2004 22:08:06 +0200, Loïc Joly
[email]loic.actarus.joly (AT) wanadoo (DOT) fr[/email]> wrote:
C'est vraiment tordu
Mais est-ce fiable ?
|
Ca dépend par rapport à quoi.
| Quote: | Notamment, est-ce que ce genre de méthode (qui
procède par élimination) est à l'abri d'un éventuel nouveau type
défini par la prochaine norme C++ ?
|
Non, mais comme si on parle de nouvelle norme, on ne peut pas dire
grand'chose (y aura-t-il même des enum, ou des templates, ou une
introspection ?), ça ne me gêne pas outre mesure. Je suis déjà plus gêné
par les extentions propriétaires.
--
Loïc
|
|
| Back to top |
|
 |
Guillaume LEMAÎTRE Guest
|
Posted: Mon Apr 05, 2004 4:59 am Post subject: Re: Spécialisation de patrons pour types énumérés |
|
|
Loïc Joly wrote:
| Quote: | Guillaume LEMAÎTRE wrote:
Je vais regarder comment c'est implémenté
Merci beaucoup pour ce lien !
Je ne sais pas trop si tu as pu comprendre à partir du code...
|
Quelques bribes pour l'instant, mais c'est vrai que c'est un peu touffu
type_traits.hpp :)
| Quote: | Par contre, dans le livre C++ Templates, the complete guide, ils
décrivent coment ce genre de chose peut être réalisé, et ce n'est pas
trivial. En voici l'idée (âmes sensibles s'abstenir):
[snip]
|
Ha oui, quand même... En tout cas merci beauoup, ça me fait avancer bien
plus vite.
J'avoue qu'il y a quelques surcharges de patrons, du genre
template<> struct Toto< void const > { ... }
ou
template<> struct Toto< void volatile > { ... }
qui m'ont plutôt surpris...
| Quote: | C'est vraiment tordu, et je quand je l'ai découvert, j'ai été surpris,
émerveillé et horrifié par ce qu'on pouvait obtenir d'un compilateur C++
sous la torture. Vivement un véritable système d'introspection, plutôt
que ces astuces barbares.
|
D'autant plus que le volume mémoire utilisé par le compilateur pour ne
résoudre ne serait-ce que is_enum doit être loin d'être négligeable. Les
performances de compilation seront bien meilleures le jour où ce sera un
support interne du compilateur.
|
|
| Back to top |
|
 |
Arnaud Meurgues Guest
|
Posted: Mon Apr 05, 2004 8:34 am Post subject: Re: Spécialisation de patrons pour types énumérés |
|
|
Loïc Joly wrote:
| Quote: | sous la torture. Vivement un véritable système d'introspection, plutôt
|
Y'a des propositions à ce sujet ?
--
Arnaud
(Supprimez les geneurs pour me répondre)
|
|
| Back to top |
|
 |
Franck Branjonneau Guest
|
Posted: Mon Apr 05, 2004 9:16 am Post subject: Re: Spécialisation de patrons pour types énumérés |
|
|
Loïc Joly <loic.actarus.joly (AT) wanadoo (DOT) fr> écrivait:
| Quote: | Ensuite, on se dit qu'une caractèristique des enum est de pouvoir se
convertir en int.
|
Je croyais que c'était vers le plus petit type puvant représenter l'enum.
| Quote: | Enfin, l'idée pour tester la convertibilité : on définie une
fonction surchargée, une surcharge prend un paramètre de type '...'
et l'autre de type int. Les deux surchages retournent des types de
taille différents, et on teste les possibilités de conversion en int
en faisant un sizeof du type de retour de la fonction "appelée"
(comme c'est dans un sizeof, la fonction n'est pas appelée, mais la
résolution de surcharge a lieu) sur le type voulu.
|
Ce qui implique que le type testé a un constructeur par défaut
n'est-ce pas ?
--
Franck Branjonneau <fasbjx (AT) free (DOT) fr>
|
|
| Back to top |
|
 |
Loïc Joly Guest
|
Posted: Mon Apr 05, 2004 7:20 pm Post subject: Re: Spécialisation de patrons pour types énumérés |
|
|
Arnaud Meurgues wrote:
| Quote: | Loïc Joly wrote:
sous la torture. Vivement un véritable système d'introspection, plutôt
Y'a des propositions à ce sujet ?
|
J'ai vu 2/3 embryons par-ci par-là, mais pas de vraie proposition.
Maintenant, je n'ai pas non plus vraiment cherché.
Faudrait demander à mieux renseigné... Gaby ?
--
Loïc
|
|
| Back to top |
|
 |
Loïc Joly Guest
|
Posted: Mon Apr 05, 2004 11:42 pm Post subject: Re: Spécialisation de patrons pour types énumérés |
|
|
Franck Branjonneau wrote:
| Quote: | Loïc Joly <loic.actarus.joly (AT) wanadoo (DOT) fr> écrivait:
Ensuite, on se dit qu'une caractèristique des enum est de pouvoir se
convertir en int.
Je croyais que c'était vers le plus petit type puvant représenter l'enum.
Je lis : |
The value of an enumerator or an object of an enumeration type is
converted to an integer by integral promotion
(4.5)
L'emploi de "integer" et non pas "integral type" me fait pencher pour
int, mais je ne suis pas un expert de la norme.
| Quote: |
Enfin, l'idée pour tester la convertibilité : on définie une
fonction surchargée, une surcharge prend un paramètre de type '...'
et l'autre de type int. Les deux surchages retournent des types de
taille différents, et on teste les possibilités de conversion en int
en faisant un sizeof du type de retour de la fonction "appelée"
(comme c'est dans un sizeof, la fonction n'est pas appelée, mais la
résolution de surcharge a lieu) sur le type voulu.
Ce qui implique que le type testé a un constructeur par défaut
n'est-ce pas ?
|
Ca fait partie des 2/3 détails scabreux que j'ai enlevé pour raisons de
briéveté. Je n'ai pas mon livre sous la main pour vérifier, mais ce
détail était pris en compte. Si tu veux, j'essaye de penser à regarder
ça demain au boulot.
--
Loïc
|
|
| Back to top |
|
 |
Franck Branjonneau Guest
|
Posted: Tue Apr 06, 2004 2:59 pm Post subject: Re: Spécialisation de patrons pour types énumérés |
|
|
Loïc Joly <loic.actarus.joly (AT) wanadoo (DOT) fr> écrivait:
| Quote: | Franck Branjonneau wrote:
Loïc Joly <loic.actarus.joly (AT) wanadoo (DOT) fr> écrivait:
Ensuite, on se dit qu'une caractèristique des enum est de pouvoir se
convertir en int.
Je croyais que c'était vers le plus petit type puvant représenter
l'enum.
Je lis :
The value of an enumerator or an object of an enumeration type is
converted to an integer by integral promotion
(4.5)
|
Et que dit (4.5) ?
| Quote: | Enfin, l'idée pour tester la convertibilité : on définie une
fonction surchargée, une surcharge prend un paramètre de type '...'
et l'autre de type int. Les deux surchages retournent des types de
taille différents, et on teste les possibilités de conversion en int
en faisant un sizeof du type de retour de la fonction "appelée"
(comme c'est dans un sizeof, la fonction n'est pas appelée, mais la
résolution de surcharge a lieu) sur le type voulu.
Ce qui implique que le type testé a un constructeur par défaut
n'est-ce pas ?
Ca fait partie des 2/3 détails scabreux que j'ai enlevé pour raisons
de briéveté. Je n'ai pas mon livre sous la main pour vérifier, mais ce
détail était pris en compte. Si tu veux, j'essaye de penser à regarder
ça demain au boulot.
|
S'il te plaît.
--
Franck Branjonneau <fasbjx (AT) free (DOT) fr>
|
|
| Back to top |
|
 |
Loïc Joly Guest
|
Posted: Wed Apr 07, 2004 8:22 pm Post subject: Re: Spécialisation de patrons pour types énumérés |
|
|
Franck Branjonneau wrote:
| Quote: | Loïc Joly <loic.actarus.joly (AT) wanadoo (DOT) fr> écrivait:
[...]
Je lis :
The value of an enumerator or an object of an enumeration type is
converted to an integer by integral promotion
(4.5)
Et que dit (4.5) ?
|
Bin, le contraire de ce que je pensais...
An rvalue of type wchar_t (3.9.1) or an enumeration type (7.2) can be
converted to an rvalue of the first of the following types that can
represent all the values of its underlying type: int, unsigned int,
long, or unsigned long.
De plus, en relisant le code du bouquin, ils vérifient la convertibilité
vers l'un quelconque des types entiers.
[...]
| Quote: | Ce qui implique que le type testé a un constructeur par défaut
n'est-ce pas ?
Ca fait partie des 2/3 détails scabreux que j'ai enlevé pour raisons
de briéveté. Je n'ai pas mon livre sous la main pour vérifier, mais ce
détail était pris en compte. Si tu veux, j'essaye de penser à regarder
ça demain au boulot.
S'il te plaît.
|
Comme on ne sait pas comment construire un T, en fait on passe à la
fonction non pas un T t mais le retour d'une fonction T f() qui est
déclarée mais non définie (ça suffit pour le sizeof). Et en fait, le
fait de passer par une convertion définie par l'utilisateur (pour
déterminer les types uniquement convertibles en int par ce genre de
convertion prend en charge cette fonction) suffit pour ça.
Extrait de ce livre :
template<typename T,
bool convert_possible = !CompoundT
!CompoundT<T>::isArrayT>
class ConsumeUDC {
public:
operator T() const()
}
// conversion to function types is not possible
template <typename T>
class ConsumeUDC<T, false> {
}
// conversion to void type is not possible
template<bool convert_possible>
class ConsumeUDC<void, convert_possible> {
}
--
Loïc
|
|
| Back to top |
|
 |
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
|