+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