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

  FORUM HardWare.fr
  Programmation
  C++

  template instanciation explicite

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

template instanciation explicite

n°1860175
weblook$$
Posté le 11-03-2009 à 09:59:01  profilanswer
 

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.

mood
Publicité
Posté le 11-03-2009 à 09:59:01  profilanswer
 

n°1860216
Taz
bisounours-codeur
Posté le 11-03-2009 à 11:07:15  profilanswer
 

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


Message édité par Taz le 11-03-2009 à 11:07:29
n°1861551
jesus_chri​st
votre nouveau dieu
Posté le 14-03-2009 à 18:53:06  profilanswer
 

+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
n°1861578
weblook$$
Posté le 14-03-2009 à 19:52:10  profilanswer
 

pas mal merci

n°1880172
Glock 17Pr​o
Posté le 02-05-2009 à 13:23:23  profilanswer
 

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
n°1880235
Taz
bisounours-codeur
Posté le 03-05-2009 à 02:14:35  profilanswer
 

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

n°1880277
Glock 17Pr​o
Posté le 03-05-2009 à 14:04:01  profilanswer
 

c'est utilisé dans quelle situation en pratique ?

n°1880327
jesus_chri​st
votre nouveau dieu
Posté le 03-05-2009 à 16:52:32  profilanswer
 

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.

n°1880330
Glock 17Pr​o
Posté le 03-05-2009 à 17:05:13  profilanswer
 

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

n°1882453
jesus_chri​st
votre nouveau dieu
Posté le 09-05-2009 à 18:48:34  profilanswer
 

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.

mood
Publicité
Posté le 09-05-2009 à 18:48:34  profilanswer
 

n°1882471
Joel F
Real men use unique_ptr
Posté le 09-05-2009 à 19:32:06  profilanswer
 

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

n°1882751
Glock 17Pr​o
Posté le 10-05-2009 à 22:05:18  profilanswer
 

thanks

n°1884348
jesus_chri​st
votre nouveau dieu
Posté le 13-05-2009 à 19:46:03  profilanswer
 

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.


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

  template instanciation explicite

 

Sujets relatifs
template de déclaration d'un copy-constructeur en friend (combo \o/)SVP, Comment inserer une template flash sur dreamweaver
XSLT templatetemplate
template et functortemplate et version des compilateurs
classe template avec pointeur membre sur la classetemplate template parameters
template syntaxeprécision: template et inline
Plus de sujets relatifs à : template instanciation explicite


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