Что означает шаблон <> с пустыми угловыми скобками в C ++? - PullRequest
38 голосов
/ 09 июня 2011
template<>
class A{
//some class data
};

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

Ответы [ 3 ]

60 голосов
/ 09 июня 2011

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> и т. Д.).

8 голосов
/ 09 июня 2011

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

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

7 голосов
/ 09 июня 2011

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

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

... что будет шаблонной специализацией для типа foo.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...