paramètre template constant et type sous jacent d'enum

paramètre template constant et type sous jacent d'enum - C++ - Programmation

Marsh Posté le 05-08-2005 à 11:13:01    

Bonjour,
 
petite question : je cherche à "typifier" un enum. Probleme évident, on ne connais pas le type sous-jacent :/
 

Code :
  1. #define TYPIFY(enumVal, typeVal)\
  2. template <__typeof__(enumVal) N>\
  3. struct typeVal\
  4. {\
  5.     enum { value = N };\
  6. }
  7. enum Enum { FOO, BAR };
  8. TYPIFY(FOO, Wfoo);


 
L'extension typeof ne passe pas comme parametre template constant (du moins sous le gcc périmé que j'ai sous la main), y a t'il une issue propre ? si non, decltype sera-t'il le sauveur ?

Reply

Marsh Posté le 05-08-2005 à 11:13:01   

Reply

Marsh Posté le 05-08-2005 à 11:20:07    

et à quoi est censé servir ce genre de pirouette ? (Pourquoi ne pas passer tout simplement par une valeur entière à la place de ton __typeof__(enumVal) ?)
 
Edit : en fait, j'ai carrément du mal à voir pourquoi tu peux avoir besoin de template dans ce cas :D


Message édité par theshockwave le 05-08-2005 à 11:21:27
Reply

Marsh Posté le 05-08-2005 à 11:26:21    

ben tu vois bien, a typifier n'importe quel enum, avec n'importe quel type sous sous-jacent.
 
une valeur entière ? [:sinking]

Reply

Marsh Posté le 05-08-2005 à 11:30:00    

en fait j'ai besoin de conserver la valeur de l'enum, d'ou le template.

Reply

Marsh Posté le 05-08-2005 à 11:36:08    

en meme temps, c'est la fleme de mettre un troisieme paramètre dans la macro :o Juste pour une once d'élégance quoi.

Reply

Marsh Posté le 05-08-2005 à 11:50:01    

Attendez, reflechissez pas a ma boue, je vais éditer, j'ai mélanger deux trucs la ...

Reply

Marsh Posté le 05-08-2005 à 12:04:28    

++fab a écrit :

Attendez, reflechissez pas a ma boue, je vais éditer, j'ai mélanger deux trucs la ...


ok [:petrus75]

Reply

Marsh Posté le 05-08-2005 à 12:19:47    

rien compris [:pingouino]

Reply

Marsh Posté le 05-08-2005 à 16:27:07    

ça y est, en fait je ne m'étais pas trop vautré. Ce code compile avec gcc 3.4.4, et supérieur, mais pas 3.2.3. Entre les deux, j'ai pas essayé. ça dit quoi sous visual ? sous icc ?  
Par contre, l'intéret est plutot limité, enfin je vais essayer de lui en trouver un :)
 

Code :
  1. #include <iostream>
  2. #define TYPIFY(enumVal, enumType)\
  3. template <__typeof__(enumVal) N>\
  4. struct Enum_\
  5. {\
  6.     enum { value = N };\
  7. };\
  8. typedef Enum_<enumVal> enumType
  9. enum { FOO = 300, BAR };
  10. TYPIFY(FOO, Wfoo);
  11. int main()
  12. {
  13.     Wfoo foo;
  14.     std::cout << foo.value << '\n';
  15. }


 

Reply

Marsh Posté le 05-08-2005 à 16:35:57    

VS .NET 2003 ne connait pas __typeof__
 
 
Edit : en revanche, si je fais ca :

Code :
  1. #include <iostream>
  2. #define TYPIFY(enumVal, enumType)\
  3. template <unsigned int N>\
  4. struct Enum_\
  5. {\
  6.     enum { value = N };\
  7. };\
  8. typedef Enum_<enumVal> enumType
  9. enum { FOO = 300, BAR };
  10. TYPIFY(FOO, Wfoo);
  11. int main()
  12. {
  13.     Wfoo foo;
  14.     std::cout << foo.value << '\n';
  15. }


 
ca fonctionne très bien (d'où ma suggestion d'utiliser un entier)


Message édité par theshockwave le 05-08-2005 à 16:37:27
Reply

Marsh Posté le 05-08-2005 à 16:35:57   

Reply

Marsh Posté le 05-08-2005 à 16:36:41    

__typeof

Reply

Marsh Posté le 05-08-2005 à 16:38:45    

c'est en C++ managed, __typeof :)

Reply

Marsh Posté le 05-08-2005 à 16:39:30    

et si le "underlying type" de l'enum est de type int, et négatif ?

Reply

Marsh Posté le 05-08-2005 à 16:40:33    

theshockwave a écrit :

c'est en C++ managed, __typeof :)


 
C'est une extension ... qui vaut ce qu'elle vaut.

Reply

Marsh Posté le 05-08-2005 à 16:43:10    

contre toute attente, ceci :

Code :
  1. #include <iostream>
  2. #define TYPIFY(enumVal, enumType)\
  3. template <unsigned int N>\
  4. struct Enum_\
  5. {\
  6.     enum { value = N };\
  7. };\
  8. typedef Enum_<enumVal> enumType
  9. enum { FOO = -300, BAR };
  10. TYPIFY(FOO, Wfoo);
  11. int main()
  12. {
  13.     Wfoo foo;
  14.     std::cout << foo.value << '\n';
  15. }


 
affiche "-300" :heink:

Reply

Marsh Posté le 05-08-2005 à 16:46:27    

++fab a écrit :

C'est une extension ... qui vaut ce qu'elle vaut.


c'est seulement pour .Net, hein ... donc niveau "extension", c'est pas terrible, je parlerais plutôt d'une branche du langage qui se forme :/

Reply

Marsh Posté le 05-08-2005 à 16:46:50    

Citation :

affiche "-300" :heink:


 
au feu les pompiers ?


Message édité par ++fab le 05-08-2005 à 16:47:41
Reply

Marsh Posté le 05-08-2005 à 17:00:00    

mingw32 me dit "4294966996", ca me rassure :D

Reply

Marsh Posté le 05-08-2005 à 17:01:02    

Chez moi ça plante, ça renvoie un grand nombre. Trick réussi donc :)
 
ça doit etre un bug si ça marche ...

Reply

Marsh Posté le 05-08-2005 à 17:03:04    

si quoi marche ? [:petrus75]

Reply

Marsh Posté le 05-08-2005 à 17:03:45    

ta version unsigned int crenon :o

Reply

Marsh Posté le 05-08-2005 à 17:04:28    

ah, oui, évidemment que c'est anormal :D

Reply

Marsh Posté le 05-08-2005 à 17:05:51    

VS sux :D

Reply

Marsh Posté le 05-08-2005 à 17:07:54    

tu m'a pas dit si ça fonctionnait avec __typeof sous VS (Managed) ?

Reply

Marsh Posté le 05-08-2005 à 17:11:45    

j'ai pas le temps de faire un proj managed pour ca :D (je suis au taf, j'ai utilisé mon proj habituel pour tester n'importe quoi pour faire ces tests à, mais sinon, je n'aurais pas pris le temps)

Reply

Marsh Posté le 05-08-2005 à 17:12:28    


n'empêche que pour ce que tu veux faire, c'est diablement pratique, ce bug :p

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed