Используйте увеличивающийся уровень разделения, поскольку шаблоны, которые вы пишете, становятся все больше и сложнее.
Производительность будет одинаковой независимо от того, как вы отделите определения от деклараций, поэтому вашей главной заботой здесь должны быть удобочитаемость и удобство обслуживания.
При написании простого шаблона, используемого только в одном месте, объявляйте и определяйте его в соответствии с объявлениями прямо в файле CPP, где вы собираетесь его использовать. Нет смысла форсировать глобальную перекомпиляцию, если этот шаблон нужен только одному блоку кода.
file.cpp
template<class Gizmo> bool DoSomethingFancy()
{
// ...
}
Для небольших шаблонных утилит, используемых в единицах перевода, определите и объявите их вместе в файле H:
utility.h
template<class Gizmo> bool DoSomethingUseful()
{
// ...
}
По мере усложнения ваших шаблонов становится все более важным иметь возможность просматривать объявление отдельно от определения. Сначала держите все отдельно, но в одном файле:
utility.h
template<class Type> class Useful
{
bool FunctionA();
bool FunctionB();
};
template<class Type> bool Useful<Type>::FunctionA()
{
// ...
}
template<class Type> bool Useful<Type>::FunctionB()
{
// ...
}
Но в конце концов даже это станет громоздким. Когда это произойдет, разделите его на файл заголовка для объявлений и файл INC для определений. В конце заголовочного файла #include
файл INC:
utility.h:
template<class Type> class MoreUseful
{
bool FunctionA();
bool FunctionB();
};
#include "utility.inc"
utility.inc:
template<class Type> bool MoreUseful<Type>::FunctionA()
{
// ...
}
template<class Type> bool MoreUseful<Type>::FunctionB()
{
// ...
}