récupérer paramètre template int

récupérer paramètre template int - C++ - Programmation

Marsh Posté le 12-11-2010 à 11:25:59    

Bonjour,
 
bizarre de se retrouver face à un problème simple que je n'avais jamais eu l'occasion de rencontrer et que je n'arrive pas à résoudre !
 
Comment récupérer un paramètre template int?
 
Considérant une classe templatée sur un int et des définitions de types pour des valeurs données
 

Code :
  1. template<int N>
  2. class MaClasse
  3. {
  4. ...
  5. };
  6. typedef MaClasse<0> MaClasse0;
  7. typedef MaClasse<1> MaClasse1;
  8. typedef MaClasse<2> MaClasse2;


 
 
Comment faire pour récupérer la valeur de N pour ces types lors de la compilation?
 
J'ai besoin de m'en resservir comme paramètre pour un autre template, du style
 
 

Code :
  1. template<int N>
  2. void maFonction0()
  3. {
  4. ...
  5. }
  6. template<class T>
  7. void maFonction1( T* titi )
  8. {
  9.     maFonction0<T::N>();  //<- comment faire un appel comme ca?
  10. }
  11. maFonction1( new MaClasse0 );
  12. maFonction1( new MaClasse1 );


 
 
Merci !
 
-- pium
 
 
 
 
 

Reply

Marsh Posté le 12-11-2010 à 11:25:59   

Reply

Marsh Posté le 12-11-2010 à 14:15:22    

Tu viens de découvrir pourquoi il y avait des typedefs reprenant les paramètres templates dans pas mal de templates.  Définis donc une constante entière reprenant ton paramètre.


---------------
The truth is rarely pure and never simple (Oscar Wilde)
Reply

Marsh Posté le 12-11-2010 à 14:43:12    

le coup d'une variable ne va pas, il faut que ce soit accessible à la compilation.
ok pour les typedef pour les types, mais comment faire pareil pour un parametre entier ?

Reply

Marsh Posté le 12-11-2010 à 17:07:05    

Code :
  1. static int const n = N;
  2. enum { n = N };


---------------
The truth is rarely pure and never simple (Oscar Wilde)
Reply

Marsh Posté le 12-11-2010 à 20:36:44    

ou hériter de boost::mpl::integral_c et acceder au ::value

Reply

Marsh Posté le 12-11-2010 à 21:29:33    

Un Programmeur a écrit :

Code :
  1. static int const n = N;
  2. enum { n = N };



1 et 3 sont identiques ici ?


---------------
.
Reply

Marsh Posté le 12-11-2010 à 22:43:24    

Joel F a écrit :

ou hériter de boost::mpl::integral_c et acceder au ::value


 
Je crois que ton amour de boost t'égare.  Ça me semble aussi sensé que de répondre à quelqu'un qui demande comment conserver un argument du constructeur d'hériter d'une classe:
 

Code :
  1. class Entier:
  2. public:
  3.    monEntier(int i): value(i) {}
  4.    int const value;
  5. };


 
plutôt que d'ajouter un membre.  Il y a des cas où c'est effectivement ce qu'il faut faire, mais ils sont suffisamment rares pour qu'on suppose que ce n'en soit pas un sans indice sérieux.
 

Glock 17Pro a écrit :

1 et 3 sont identiques ici ?


 
Plus ou moins.  On peut s'arranger pour avoir un programme qui fait des choses différentes avec les deux, mais il faut le vouloir.


---------------
The truth is rarely pure and never simple (Oscar Wilde)
Reply

Marsh Posté le 13-11-2010 à 09:58:23    

Un Programmeur a écrit :


 
Plus ou moins.  On peut s'arranger pour avoir un programme qui fait des choses différentes avec les deux, mais il faut le vouloir.


je ne  vois pas en quoi. un exemple serait trop long à fournir ici ?


Message édité par Glock 17Pro le 13-11-2010 à 10:03:35

---------------
.
Reply

Marsh Posté le 13-11-2010 à 10:44:00    

Variations sur les templates, les types sont différents.  En y réfléchissant, c'est pire, l'enum anonyme ne peut pas être argument template (au moins en C++ 03, il me semblait que la restriction avait été levée en C++0X, mais si j'ai raison la version de g++ que j'ai ici n'implémente pas encore la nouvelle règle).

 
Code :
  1. template <typename T>
  2.   void foo(T)
  3. {
  4.     std::cout << "non specialized template version\n";
  5. }
  6. struct s
  7. {
  8.     enum { n1=42 };
  9.     static int const n2 = 42;
  10. };
  11. int main()
  12. {
  13.     foo(s::n1); // erreur
  14.     foo(s::n2); // va utiliser la spécialisation
  15. }


Message cité 1 fois
Message édité par Un Programmeur le 13-11-2010 à 10:44:45

---------------
The truth is rarely pure and never simple (Oscar Wilde)
Reply

Marsh Posté le 13-11-2010 à 12:25:27    

Un Programmeur a écrit :


Je crois que ton amour de boost t'égare.  Ça me semble aussi sensé que de répondre à quelqu'un qui demande comment conserver un argument du constructeur d'hériter d'une classe:


 
L'analogie n'est pas bonne, mais passons. Dans l'absolu, c'est de l'overkill je te le concéde mais si le dis type à besoin d'avoir une sémantique de constante statique, ca simplifie la sauce. YMMV

Reply

Marsh Posté le 13-11-2010 à 12:25:27   

Reply

Marsh Posté le 13-11-2010 à 12:26:19    

Un Programmeur a écrit :

Variations sur les templates, les types sont différents.  En y réfléchissant, c'est pire, l'enum anonyme ne peut pas être argument template (au moins en C++ 03, il me semblait que la restriction avait été levée en C++0X, mais si j'ai raison la version de g++ que j'ai ici n'implémente pas encore la nouvelle règle).


 
Ca change aussi sur les compilateurs un peu limite ou le static const int est mal géré. Ca devient rare heureusement.

Reply

Marsh Posté le 15-11-2010 à 09:34:26    

Mais c'est bien sûr, la subtilité c'est de déclarer la variable en "static const" (avec un compilo qui va bien on s'entend)! Je me demande pourquoi je n'y ai pas pensé avant.
 
Par contre il faut déclarer celle-ci en public et y accéder directement.
 
Merci pour votre aide.
 
--pium
 
 

Reply

Marsh Posté le 15-11-2010 à 10:15:24    

ou de faire un enum... au choix


---------------
.
Reply

Sujets relatifs:

Leave a Replay

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