Le standard C++ permet de séparer la déclaration d'une classe/fonction template de son implémentation au moyen du mot-clé
export. En théorie, il est donc possible de déclarer sa classe/fonction template dans un fichier .h, et de l'implémenter dans un .cpp, comme on le fait traditionnelement avec les fonctions/classes non template. Mais en pratique, c'est une fonctionnalité si complexe à réaliser que seul (à ce jour) quelques compilateurs basés sur le
front-end d'EDG implémentent (Comeau, Intel, ...). Qui plus est, il s'agit
d'une fonctionnalité du langage contreversée dont le maitient dans la prochaine norme est débattu. On peut donc considérer que même lorsque c'est possible, il n'est pas raisonnable de séparer l'implémentation d'un template de sa déclaration dans l'état actuel des choses. Autrement dit, tout son code doit figurer dans le .h.
On peut cependant conserver la logique de la séparation interface/implémentation en la simulant de cette manière:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
|
// exemple.h
#ifndef EXEMPLE_H
#define EXEMPLE_H
template <typename T>
class Exemple
{
public:
Exemple();
};
#include "exemple.tpp" // <-- astuce ici !!!
#endif |
1 2 3 4 5 6
|
// exemple.tpp
template <typename T>
Exemple<T>::Exemple()
{
} |
L'astuce consiste à inclure à la fin du .h le fichier contenant le corps du template.
Notez l'utilisation de l'extension .tpp au lieu du classique .cpp afin de faire la distinction avec les fichiers cpp classiques (pouvant être compilés, contrairement au code template qui doit d'abord être spécialisé avant de pouvoir être compilé). Il n'y a pas vraiment de convension, on trouve de nombreuses autres extensions : .htt, .tcc, .tpl, ... Libre à vous de choisir celle que vous préférez.
Partager