[C++] template et condition

template et condition [C++] - C++ - Programmation

Marsh Posté le 02-12-2002 à 13:25:04    

Ma question est peut-être un peu farfelue mais bon j'essaye tout de même :
 
Je souhaiterais faire un template sur une classe contenant au moins une fonction qui retourne un double si lors de la création d'une entité de la classe j'ai choisi ce type et retourne un float pour tous les autres types...
 
Je ne sais pas si c'est faisable mais il faudrait à mon avis faire un test sur le type passé en paramètre et instencier la bonne fonction...

Reply

Marsh Posté le 02-12-2002 à 13:25:04   

Reply

Marsh Posté le 02-12-2002 à 17:16:29    

Simple : le retour de la fonction est un template.
Regarde les tonnes d'exemple dans la doc.

Reply

Marsh Posté le 02-12-2002 à 21:28:56    

Bon, j'ai jamais utilisé la spécialisation de template, mais ton message m'a donné l'envie irrésisble d'essayer :-)
 
 

Code :
  1. #include <iostream>
  2. template <class T>
  3. class Base
  4. {
  5. public:
  6.   Base(int n):m_Number(n){}
  7.   int DoIt(){ return m_Number/3; }
  8. private:
  9.   int m_Number;
  10. };
  11. template<> class Base<float>
  12. {
  13. public:
  14.   Base(int n):m_Number(n){}
  15.   float DoIt(){ return m_Number/3.f; }
  16. private:
  17.   int m_Number;
  18. };
  19. int main()
  20. {
  21.   std::cout << Base<int>(4).DoIt() << std::endl;
  22.   std::cout << Base<float>(4).DoIt() << std::endl;
  23. }

 
 
Si tu veux  éviter de dupliquer le code (constructeur, autres fonctions membres), tu peux toujours faire une classe template de base, puis faire une classe template fille qui elle sera spécialisée.
 

Code :
  1. template <class T> Base{};
  2. template <class T> Fille:public Base<T>{};
  3. template <> Fille<double>:public Base<double>{};

Reply

Marsh Posté le 03-12-2002 à 03:05:13    

Solution 1: Spécialiser pour le type double.
Pour éviter de dupliquer le code commun, il faut le placer dans une classe de base, éventuellement patron.

Code :
  1. template <typename T>
  2. class Base{
  3. //partie commune
  4. };
  5. //patron pour tout type
  6. template<typename T>
  7. class MaClasse:public Base<T>{public:
  8. float DoIt(){ return 0; }
  9. };
  10. //spécialisation du patron pour double
  11. class MaClasse<double>:public Base<double>{public:
  12. double DoIt(){ return 0; }
  13. };


 
Solution 2: Reporter la spécialisation dans la fonction, qui doit être un objet-fonction.
Le code n'est pas dupliqué, mais la fonction n'est plus une méthode et n'accède plus aux membres.

Code :
  1. //patron d'objet fonction
  2. template <typename T>
  3. class DoItClass{public:
  4. float operator()(){ return 0; }
  5. };
  6. //spécialisation
  7. class DoItClass<double>{public:
  8. double operator()(){ return 0; }
  9. };
  10. template<typename T>
  11. class MaClasse{public:
  12. DoItClass<T> DoIt; //objet fonction
  13. };


 
Code de test commun aux deux:

Code :
  1. #include <iostream>
  2. using namespace std;
  3. int main(){
  4. cout << typeid( MaClasse<int   >().DoIt() ).name() << endl;
  5. cout << typeid( MaClasse<double>().DoIt() ).name() << endl;
  6. return 0;
  7. }


---------------
Bricocheap: Montage de ventilo sur paté de mastic silicone
Reply

Sujets relatifs:

Leave a Replay

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