En plus de ce que tout le monde a ajouté et de ce que vous faites déjà (construction parallélisée, options de compilation, etc.), envisagez de cacher les modèles dans les classes d'implémentation, auxquelles on accède par des interfaces. Cela signifie qu'au lieu d'avoir une classe comme :
// ClsWithNoTemplates.h file, included everywhere
class ClsWithTemplates
{
ComplicatedTemplate<abc> member;
// ...
public:
void FunctionUsingYourMember();
};
vous devriez avoir :
// ClsWithNoTemplates.h file:
class ClsWithTemplatesImplementation; // forward declaration
// definition included in the ClsWithNoTemplates.cpp file
// this class will have a ComplicatedTemplate<abc> member, but it is only
// included in your ClsWithNoTemplates definition file (that is only included once)
class ClsWithNoTemplates
{
ClsWithTemplatesImplementation * impl; // no templates mentioned anywhere here
public:
void FunctionUsingYourMember(); // call impl->FunctionUsingYourMember() internally
};
Cela modifie un peu votre conception de la POO, mais c'est pour le mieux : l'inclusion de la définition de "ClsWithNoTemplates" est maintenant rapide et vous ne (pré)compilez la définition de "ClsWithNoTemplates" qu'une seule fois.
De plus, si vous modifiez le code d'implémentation, tout code qui incluait ClsWithNoTemplates.h n'aura probablement pas besoin d'être redéfini.
Ce changement devrait augmenter considérablement votre temps de compilation partielle, et il sera également utile dans le cas où votre ClsWithNoTemplates est une interface publique exportée à partir d'un fichier de bibliothèque : puisque le fichier n'est pas modifié lorsque vous ne changez que l'implémentation, votre code client dépendant n'a pas besoin d'être recompilé du tout.