Специализация шаблона фактически меняет поведение шаблона для определенного типа. например, преобразовать в строку:
template<typename T> std::string convertToString( const T& t )
{
std::ostringstream oss;
oss << t;
return oss.str();
}
Давайте специализируемся на этом, хотя, когда наш тип уже является std :: string, так как бессмысленно проходить через ostringstream
template<> std::string convertToString( const std::string & t )
{
return t;
}
Вы можете специализироваться и на занятиях.
Теперь инстанцирование: это сделано, чтобы позволить вам переместить компиляцию для определенных типов в одну единицу компиляции. Это может сэкономить вам время на компиляцию, а иногда и наворот.
Допустим, мы превращаем вышеупомянутое в класс с именем StringConvert, а не в функцию.
template<typename T>
class StringConvert
{
public:
// 4 static functions to convert from T to string, string to T,
// T to wstring and wstring to T using streams
};
Мы преобразуем много целых чисел в строки, чтобы мы могли создать их экземпляр: поместите это в один заголовок
extern template class StringConvert<int>;
Поместите это в одну единицу компиляции:
template class StringConvert<int>;
Обратите внимание, что вышеупомянутое также может быть выполнено (без extern в заголовке) с функциями, которые фактически не реализованы встроенными. Один из ваших модулей компиляции будет реализовывать их. Однако тогда ваш шаблон ограничен только созданными экземплярами типов. Иногда это делается, когда в шаблоне есть виртуальный деструктор.