Je veux dire, à part son nom obligatoire (la bibliothèque standard de modèles)...
Le C++ avait initialement pour but de présenter les concepts de la POO en C. C'est-à-dire que vous pouviez dire ce qu'une entité spécifique pouvait et ne pouvait pas faire (indépendamment de la manière dont elle le fait) en vous basant sur sa classe et sa hiérarchie de classes. Certaines compositions de capacités sont plus difficiles à décrire de cette manière en raison des problèmes d'héritage multiple, et du fait que le C++ supporte le concept d'interfaces d'une manière quelque peu maladroite (comparé à Java, etc.), mais c'est là (et pourrait être amélioré).
Et puis les modèles sont entrés en jeu, ainsi que la STL. Le STL semblait prendre les concepts classiques de la POO et les jeter dans les égouts, en utilisant des modèles à la place.
Il faut distinguer les cas où les modèles sont utilisés pour généraliser des types où les types eux-mêmes ne sont pas pertinents pour le fonctionnement du modèle (les conteneurs, par exemple). Le fait d'avoir un vector<int>
est parfaitement logique.
Cependant, dans de nombreux autres cas (itérateurs et algorithmes), les types gabarits sont censés suivre un "concept" (Input Iterator, Forward Iterator, etc...) où les détails réels du concept sont définis entièrement par l'implémentation de la fonction/classe du gabarit, et non par la classe du type utilisé avec le gabarit, ce qui est un peu un anti-usage de la POO.
Par exemple, vous pouvez dire à la fonction :
void MyFunc(ForwardIterator<...> *I);
Mise à jour : Comme il n'était pas clair dans la question originale, ForwardIterator est ok pour être templé lui-même pour permettre n'importe quel type de ForwardIterator. Le contraire est d'avoir ForwardIterator comme un concept.
s'attend à un forward Iterator uniquement en regardant sa définition, alors qu'il faudrait soit regarder l'implémentation, soit la documentation pour :
template <typename Type> void MyFunc(Type *I);
Deux arguments en faveur de l'utilisation des templates : le code compilé peut être rendu plus efficace, en compilant sur mesure le template pour chaque type utilisé, au lieu d'utiliser les vtables. Et le fait que les templates peuvent être utilisés avec des types natifs.
Cependant, je cherche une raison plus profonde pour laquelle abandonner la POO classique en faveur de la modélisation pour la STL (en supposant que vous ayez lu jusqu'ici :P).