Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1052 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  récupérer paramètre template int

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

récupérer paramètre template int

n°2035586
europium
Ancien leader WormsHL
Posté le 12-11-2010 à 11:25:59  profilanswer
 

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
 
 
 
 
 

mood
Publicité
Posté le 12-11-2010 à 11:25:59  profilanswer
 

n°2035645
Un Program​meur
Posté le 12-11-2010 à 14:15:22  profilanswer
 

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)
n°2035657
europium
Ancien leader WormsHL
Posté le 12-11-2010 à 14:43:12  profilanswer
 

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 ?

n°2035703
Un Program​meur
Posté le 12-11-2010 à 17:07:05  profilanswer
 

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


---------------
The truth is rarely pure and never simple (Oscar Wilde)
n°2035732
Joel F
Real men use unique_ptr
Posté le 12-11-2010 à 20:36:44  profilanswer
 

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

n°2035740
Glock 17Pr​o
Posté le 12-11-2010 à 21:29:33  profilanswer
 

Un Programmeur a écrit :

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



1 et 3 sont identiques ici ?


---------------
.
n°2035741
Un Program​meur
Posté le 12-11-2010 à 22:43:24  profilanswer
 

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)
n°2035764
Glock 17Pr​o
Posté le 13-11-2010 à 09:58:23  profilanswer
 

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

---------------
.
n°2035768
Un Program​meur
Posté le 13-11-2010 à 10:44:00  profilanswer
 

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)
n°2035772
Joel F
Real men use unique_ptr
Posté le 13-11-2010 à 12:25:27  profilanswer
 

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

mood
Publicité
Posté le 13-11-2010 à 12:25:27  profilanswer
 

n°2035775
Joel F
Real men use unique_ptr
Posté le 13-11-2010 à 12:26:19  profilanswer
 

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.

n°2035947
europium
Ancien leader WormsHL
Posté le 15-11-2010 à 09:34:26  profilanswer
 

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
 
 

n°2035956
Glock 17Pr​o
Posté le 15-11-2010 à 10:15:24  profilanswer
 

ou de faire un enum... au choix


---------------
.

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  récupérer paramètre template int

 

Sujets relatifs
[resolu]allocation dynamique double pointeur passer en parametreRécupérer un tableau d'une autre page web
[C++] Récupérer la taille d'un fichier binaireCréation worksheet via template
Récuperer objet dans tableau en fonction du champ d'un objet[flash] récupérer des vidéos
[RESOLU] typedef de classe templateProblème pour récupérer un tableau
Récupérer contenu d'un JTextField[XML] récuperer le nom du noeud et ses attributs par DOM ?
Plus de sujets relatifs à : récupérer paramètre template int


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR