C++Talk.NET Forum Index C++Talk.NET
C++ language newsgroups
 
Archives   FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Re: Spécialisation de patrons pour typesénumérés

 
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (French)
View previous topic :: View next topic  
Author Message
Falk Tannhäuser
Guest





PostPosted: Thu Apr 01, 2004 9:10 am    Post subject: Re: Spécialisation de patrons pour typesénumérés Reply with quote



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





PostPosted: Thu Apr 01, 2004 6:09 pm    Post subject: Re: Spécialisation de patrons pour types énumérés Reply with quote



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





PostPosted: Sun Apr 04, 2004 8:08 pm    Post subject: Re: Spécialisation de patrons pour types énumérés Reply with quote



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





PostPosted: Sun Apr 04, 2004 9:08 pm    Post subject: Re: Spécialisation de patrons pour types énumérés Reply with quote

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





PostPosted: Sun Apr 04, 2004 9:39 pm    Post subject: Re: Spécialisation de patrons pour types énumérés Reply with quote

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





PostPosted: Mon Apr 05, 2004 4:59 am    Post subject: Re: Spécialisation de patrons pour types énumérés Reply with quote

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





PostPosted: Mon Apr 05, 2004 8:34 am    Post subject: Re: Spécialisation de patrons pour types énumérés Reply with quote

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





PostPosted: Mon Apr 05, 2004 9:16 am    Post subject: Re: Spécialisation de patrons pour types énumérés Reply with quote

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





PostPosted: Mon Apr 05, 2004 7:20 pm    Post subject: Re: Spécialisation de patrons pour types énumérés Reply with quote

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





PostPosted: Mon Apr 05, 2004 11:42 pm    Post subject: Re: Spécialisation de patrons pour types énumérés Reply with quote

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





PostPosted: Tue Apr 06, 2004 2:59 pm    Post subject: Re: Spécialisation de patrons pour types énumérés Reply with quote

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





PostPosted: Wed Apr 07, 2004 8:22 pm    Post subject: Re: Spécialisation de patrons pour types énumérés Reply with quote

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
Display posts from previous:   
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (French) All times are GMT
Page 1 of 1

 
Jump to:  
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


Powered by phpBB © 2001, 2006 phpBB Group
SEO toolkit © 2004-2006 webmedic.