template<>
class A{
//some class data
};
Я видел такой код много раз.
каково использование template<>
в приведенном выше коде?
И каковы случаи, когда нам нужно использовать его?
template<>
class A{
//some class data
};
Я видел такой код много раз.
каково использование template<>
в приведенном выше коде?
И каковы случаи, когда нам нужно использовать его?
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>
и т.д.).
template<>
вводит общую специализацию шаблона. Ваш пример сам по себе не является действительным; вам понадобится более подробный сценарий, прежде чем он станет полезным:
template <typename T>
class A
{
// body for the general case
};
template <>
class A<bool>
{
// body that only applies for T = bool
};
int main()
{
// ...
A<int> ai; // uses the first class definition
A<bool> ab; // uses the second class definition
// ...
}
Это выглядит странно, потому что это особый случай более мощной функции, которая называется "частичная специализация".
Не выглядит правильным. Теперь вы могли бы написать:
template<>
class A<foo> {
// some stuff
};
..., который был бы специализированным шаблоном для типа foo.