Подтвердить что ты не робот

Шаблон <> в С++

template<>
class A{
//some class data
};

Я видел такой код много раз. каково использование template<> в приведенном выше коде? И каковы случаи, когда нам нужно использовать его?

4b9b3361

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

Ответ 2

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
    // ...
}

Это выглядит странно, потому что это особый случай более мощной функции, которая называется "частичная специализация".

Ответ 3

Не выглядит правильным. Теперь вы могли бы написать:

template<>
class A<foo> {
// some stuff
};

..., который был бы специализированным шаблоном для типа foo.