Помимо того, что добавили все остальные и что вы уже делаете (параллельная сборка, параметры компилятора и т. Д.), Рассмотрите возможность скрытия шаблонов в классах реализации, доступ к которым осуществляется через интерфейсы. Это означает, что вместо такого класса, как:
// ClsWithNoTemplates.h file, included everywhere
class ClsWithTemplates
{
ComplicatedTemplate<abc> member;
// ...
public:
void FunctionUsingYourMember();
};
вы должны иметь:
// 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
};
Это немного меняет ваш дизайн ООП, но это к лучшему: в том числе определение ClsWithNoTemplates теперь fast , и вы только (предварительно) компилируете определение ClsWithNoTemplates 'один раз.
Кроме того, если вы измените код реализации, любой код, включающий ClsWithNoTemplates.h, вероятно, не нуждается в переопределении.
Это изменение должно значительно увеличить ваше частичное время компиляции, и оно также поможет в случае, когда ваши ClsWithNoTemplates являются публичным интерфейсом, экспортируемым из файла библиотеки: поскольку файл не изменяется, когда вы изменяете только реализацию, ваш зависимый клиент код вообще не нужно перекомпилировать.