Spécialisation template

Spécialisation template - C++ - Programmation

Marsh Posté le 02-06-2009 à 23:25:37    

Bonjour,
 
Le code suivant est extrait de boost (boost/exception/exception.hpp).
 

Code :
  1. template <class Tag,class T>
  2.     class error_info;
  3.     typedef error_info<struct tag_throw_function,char const *> throw_function;
  4.     typedef error_info<struct tag_throw_file,char const *> throw_file;
  5.     typedef error_info<struct tag_throw_line,int> throw_line;
  6.     template <>
  7.     class
  8.     error_info<tag_throw_function,char const *>
  9.         {
  10.         public:
  11.         typedef char const * value_type;
  12.         value_type v_;
  13.         explicit
  14.         error_info( value_type v ):
  15.             v_(v)
  16.             {
  17.             }
  18.         };
  19.     template <>
  20.     class
  21.     error_info<tag_throw_file,char const *>
  22.         {
  23.         public:
  24.         typedef char const * value_type;
  25.         value_type v_;
  26.         explicit
  27.         error_info( value_type v ):
  28.             v_(v)
  29.             {
  30.             }
  31.         };
  32.     template <>
  33.     class
  34.     error_info<tag_throw_line,int>
  35.         {
  36.         public:
  37.         typedef int value_type;
  38.         value_type v_;
  39.         explicit
  40.         error_info( value_type v ):
  41.             v_(v)
  42.             {
  43.             }
  44.         };


 
Je me pose deux questions :
 

  • Pourquoi utiliser le mot clef struct pour les lignes typedef error_info< struct ... ?
  • Il me semble que template <> ... est utilisé pour faire une spécialisation totale du template mais visiblement un seul des deux types est spécifié. Est-ce licite d'écrire un truc comme ça ?


Merci d'avance pour vos réponses.

Reply

Marsh Posté le 02-06-2009 à 23:25:37   

Reply

Marsh Posté le 03-06-2009 à 07:08:30    

1/ structure localisée sans existence hors du typedef
2/ moi je vois 2 types par specialisation ....

Reply

Marsh Posté le 03-06-2009 à 08:55:05    

Joel F a écrit :


2/ moi je vois 2 types par specialisation ....


Dans le cas de la première spécialisation le deuxième type est un const char*, mais  tag_throw_function c'est quoi ?

Reply

Marsh Posté le 03-06-2009 à 09:11:33    

c'est une struct vide ça permet juste de faire de 'la surcharge' et d'aller dans la spécialisation de template adéquate. c'est une astuce quoi en somme!


Message édité par frenchtoucco le 03-06-2009 à 09:17:17

---------------
je connais tout, je ne sais rien, seule certitude, à vouloir trop on finit par tout perdre.
Reply

Marsh Posté le 03-06-2009 à 11:24:16    

geo la frite a écrit :


Dans le cas de la première spécialisation le deuxième type est un const char*, mais  tag_throw_function c'est quoi ?


 
la struct définie juste au dessus

Reply

Sujets relatifs:

Leave a Replay

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