template instanciation explicite - C++ - Programmation
Marsh Posté le 11-03-2009 à 11:07:15
Pour gagner en temps de compilation, ou pour cacher une implémentation.
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.
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
Marsh Posté le 03-05-2009 à 02:14:35
bah générer uniquement le constructeur et pas la classe entière.
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.
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?
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 :
|
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.
Marsh Posté le 09-05-2009 à 19:32:06
ouais enfin là, si tu veut faire ça, tu fais une STATIC_ASSERT
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.
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.