Templates extern (C++11)

De RAD Studio
Aller à : navigation, rechercher

Remonter à Fonctionnalités C++11 - Index

C++Builder 2009 inclut l'utilisation des templates extern, qui vous permettent de définir des templates qui ne sont pas instanciés dans une unité de traduction. L'utilisation des templates extern réduit ainsi à la fois le temps de compilation et la taille du module compilé. Cette fonctionnalité fait partie du nouveau standard C++11.

Déclaration et instanciation explicites

Un template extern vous permet de déclarer un template sans l'instancier dans l'unité de traduction.

Pour illustrer, le code suivant crée et instancie un template :

template <class T>
class MyClass {
   // code divers
}

template class MyClass<int>;
...
MyClass<int> myClass;

La ligne template class MyClass<int> est une définition de template explicite et provoque l'instanciation du template dans son unité de code, ce qui génère du code pour le template dans cette unité. De même, la ligne MyClass<int> myClass; instancie implicitement le template, générant également du code dans l'unité. Si l'une de ces lignes de code est dans votre unité, le template est instancié ici.

Toutefois, supposons que vous souhaitez avoir une bibliothèque dans laquelle toutes les instanciations de ce template surviennent, et que vous voulez faire référence à ces instanciations dans un exécutable. Pour rendre une déclaration de template explicite qui n'instancie pas le template dans votre unité de code, utilisez le code suivant :

extern template class MyClass<int>;

Vous pouvez alors faire référence au template, mais le compilateur ne génère pas de code pour lui dans cette unité de traduction.

Utilisation d'un template extern

Voici les règles d'utilisation des templates extern :

  • Une instanciation de template doit suivre une déclaration de template explicite dans cette unité de traduction ou bien être dans une autre unité de traduction. Cela est similaire à l'utilisation usuelle de extern : l'entité référencée doit être définie quelque part.
  • Une définition de template explicite doit se produire une seule fois dans une unité.
  • Une définition de template explicite doit suivre une déclaration de template explicite si les deux sont présentes dans une unité de traduction.
  • Une déclaration de template explicite peut seulement s'appliquer aux noms des objets, fonctions et aux instanciations de templates explicites. Elle ne peut pas faire référence à une fonction statique, mais peut s'appliquer à une fonction membre statique.
  • Le spécificateur extern ne peut pas être utilisé dans la déclaration de paramètres ou de membres de classe.
  • Une déclaration de template explicite supprime seulement la génération du code si ce template n'a pas été instancié avec la même spécialisation. Par exemple :
template class MyClass<int>;
...
extern template class MyClass<int>;    // non autorisé
extern template class MyClass<float>;  // OK

Voir aussi