Ответ 1
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>
и т.д.).