template<>
сообщает компилятору, что следует специализация шаблона, в частности полная специализация . Обычно class A
должен выглядеть примерно так:
template<class T>
class A{
// general implementation
};
template<>
class A<int>{
// special implementation for ints
};
Теперь, когда используется A<int>
, используется специализированная версия. Вы также можете использовать его для специализации функций:
template<class T>
void foo(T t){
// general
}
template<>
void foo<int>(int i){
// for ints
}
// doesn't actually need the <int>
// as the specialization can be deduced from the parameter type
template<>
void foo(int i){
// also valid
}
Обычно, однако, вы не должны специализировать функции, так как простые перегрузки обычно считаются превосходящими :
void foo(int i){
// better
}
А теперь, чтобы сделать это излишним, ниже приводится частичная специализация :
template<class T1, class T2>
class B{
};
template<class T1>
class B<T1, int>{
};
Работает так же, как и полная специализация, только то, что специализированная версия используется всякий раз, когда вторым параметром шаблона является int
(например, B<bool,int>
, B<YourType,int>
и т. Д.).