template instanciation explicite

template instanciation explicite - C++ - Programmation

Marsh Posté le 11-03-2009 à 09:59:01    

HI,
 
 
Je me demandais dans quel cas l'instanciation explicite d'une classe ou fonction template doit être utilisée ? Ou autrement dit  
quel est l'avantage d'utiliser l'instanciation explicite  ?
 
Merci.

Reply

Marsh Posté le 11-03-2009 à 09:59:01   

Reply

Marsh Posté le 11-03-2009 à 11:07:15    

Pour gagner en temps de compilation, ou pour cacher une implémentation.


Message édité par Taz le 11-03-2009 à 11:07:29
Reply

Marsh Posté le 14-03-2009 à 18:53:06    

+1
Histoire de donner un exemple concret :
 
suppose que t'as codé une lib de calcul matriciel. Elle fonctionne avec, au choix, le type float, double et long double. Bien sûr pour ne pas réécrire 3x le même code, tu en as fait un template.
 
Mais voilà, le problème c'est que déjà tu ne veux pas avoir à livrer le code source (or avec les templates, et sans support de export, c'est obligatoire) et puis tu ne souhaite pas que ton template soit instancié avec un autre type que les 3 prévus.
 
Pour se limiter aux 3 types, il y a moyen en jouant sur des static_assert ou tout autre système équivalent. Mais pour cacher le code, il n'y a qu'un moyen : livrer juste les déclarations du code, sans implémentation, et instancier explicitement ton template avec les 3 types dans une lib, qui sera fournie.
 
Ca permet aussi de gagner des perfs : le compilo ne génèrera pas de code à chaque fois qu'il instanciera un template, puisque le code ne lui est pas disponible. C'est le linker qui fera le travail avec la lib fournie, une et une seule fois.
Sinon, à chaque unité de compilation, tous les templates sont instanciés et génèrent du code, puis le linker à la fin se trouve avec plusieurs instantiations et doit linker avec une seule. Ca prend beaucoup de temps.
 
edit : qd je dis perfs, c'est à la compilation, à l'exécution on ne gagne rien, voire on perd puisque l'inlining ne peut se faire qu'au link et pas à la compil.


Message édité par jesus_christ le 14-03-2009 à 18:54:32
Reply

Marsh Posté le 14-03-2009 à 19:52:10    

pas mal merci

Reply

Marsh Posté le 02-05-2009 à 13:23:23    

Quel est l'intérêt d'instancier uniquement le constructeur d'une classe template explicitement et non la classe en entière :

 

template MyClass<double>::MyClass(); // generate constructor
vs
template class MyClass<long>;  // generate the whole class

 



Message édité par Glock 17Pro le 02-05-2009 à 13:38:33
Reply

Marsh Posté le 03-05-2009 à 02:14:35    

bah générer uniquement le constructeur et pas la classe entière.

Reply

Marsh Posté le 03-05-2009 à 14:04:01    

c'est utilisé dans quelle situation en pratique ?

Reply

Marsh Posté le 03-05-2009 à 16:52:32    

j'avoue ne pas trop voir de cas pratique, sauf si le type utilisé pour instancier (ici long) ne permet pas d'instancier les autres fonctions membres. C'est possible et c'est toléré par le langage, tant que la méthode n'est ni utilisée ni instanciées explicitement, justement.

Reply

Marsh Posté le 03-05-2009 à 17:05:13    

sauf si le type utilisé pour instancier (ici long) ne permet pas d'instancier les autres fonctions membres
 
tu aurais un exemple stp?

Reply

Marsh Posté le 09-05-2009 à 18:48:34    

Un exemple ultra-tiré par les cheveux, juste pour illuster.
Supposons que sizeof( int ) == 4 et sizeof( long ) == 8.
 

Code :
  1. template< typename T >
  2. class Toto
  3. {
  4. public:
  5.     const char* Hello() const { return "Hello"; }
  6.     int Compute() const
  7.     {
  8.          int t[ 8 - sizeof( T ) ];
  9.          t[ 0 ] = 42;
  10.          return t[ 0 ];
  11.     }
  12. };
  13. // on instancie explicitement Toto< long >::Hello(), tout va bien
  14. template const char* Toto< long >::Hello();
  15. // on instancie explicitement Toto< int >, tout va bien
  16. template class Toto< int >;
  17. // on instancie explicitement Toto< long >, erreur
  18. template class Toto< long >;


 
Ce programme est idiot, mais il illustre que bien que la classe Toto ne soit pas instanciable avec long (à cause du tableau de 0 cases que ça ferait), il est possible d'instancier Toto< long >::Hello() séparément.

Reply

Marsh Posté le 09-05-2009 à 18:48:34   

Reply

Marsh Posté le 09-05-2009 à 19:32:06    

ouais enfin là, si tu veut faire ça, tu fais une STATIC_ASSERT :/

Reply

Marsh Posté le 10-05-2009 à 22:05:18    

thanks

Reply

Marsh Posté le 13-05-2009 à 19:46:03    

joelf : bien sûr, j'ai dit que c'est un exemple idiot, le tableau de zero cases c'était ce qui m'est passé par la tête. C'était pour illuster la possibiliter d'instancier juste une méthode sans instancier toute la classe.

Reply

Sujets relatifs:

Leave a Replay

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