Шаблоны классов Частичная специализация - PullRequest
0 голосов
/ 02 апреля 2011

Следующий код успешно компилируется, и я не понимаю, почему:

#include <stdio.h>
#include <vector>
#include <iostream>

// Template definition
template <typename T1, typename T2> class stack
{
};

// Template specialization
template <> class stack <float, float>
{
};

int main ()
{
  stack <char, char> objStack;
  return 0;
}    

Не означает ли частичная специализация, что мы можем использовать класс для некоторых определенных типы данных, которые мы указываем в специализациях?

Здесь нет специализированного класса для char , и собирается ли он компилироваться с любым видомтипы данных, тогда какова цель специализации?

Ответы [ 2 ]

2 голосов
/ 02 апреля 2011

Шаблонная специализация предназначена для тех случаев, когда вы хотите сделать что-то особенное для определенных параметров шаблона. Компилятор создаст экземпляр всего, что не указано в исходном шаблоне.

Это полезно, когда требуется другое поведение для определенного типа данных, но также может использоваться для более сложного сопоставления с образцом, например, для изменения поведения для типов указателей или const типов:

template <typename T>
struct is_pointer { static bool value = false; };

template <typename T>
struct is_pointer<T*> { static bool value = true; };

template <typename T>
struct is_const { static bool value = false; };

template <typename T>
struct is_const<const T>  { static bool value = true; };

// later, try this:
assert(is_pointer<int*>::value == true);
assert(is_pointer<int>::value == false);

Итак, короткая история: не утруждайте себя указанием вашего шаблона, если у вас нет ничего особенного, связанного с определенным параметром, который вы не можете обобщить в базовый шаблон. Специализация шаблонов - это довольно жесткая форма сопоставления с образцом, которую можно использовать как для добра, так и для зла.

2 голосов
/ 02 апреля 2011

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

В вашем примере эта функция является общим шаблоном.

// Template definition
template <typename T1, typename T2> class stack
{
};

Он будет создан для всех типов, для которых вы дадите ИСКЛЮЧЕНИЕ, если вы дадите два числа с плавающей запятой.В случае если вы задаете два числа с плавающей точкой в ​​качестве параметров, будет создан экземпляр шаблона

// Template specialization
template <> class stack <float, float>
{
};

.

...