Пример специализации шаблона - PullRequest
2 голосов
/ 03 ноября 2019

Насколько я понимаю, специализация шаблонов работает следующим образом

template<typename T> 
void dummy(T a) { std::cout<<a<<std::endl; }

template<>
void dummy<int>(int a) { std::cout<<"special"<<std::endl; }

Я искал следующий код, который проверяет, является ли что-то указателем или нет:

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

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

Это все ещешаблонная специализация? Почему линия template <typename T> там опять в специализации, а не <>. Это потому, что компилятор генерирует несколько специализаций, когда у нас есть T*, а не T?

Будет ли этот код расширяться до

template<>
struct is_ptr<int*>
{
  constexpr static bool value = true;
};

?

1 Ответ

4 голосов
/ 03 ноября 2019

Ваш первый пример - function template specialization. Примером is_ptr является partial class template specialization.

шаблоны функций не могут быть parilially specailzied, шаблоны классов могут быть.

Причина template <typename T> в частичной специализации шаблона класса именно потому, что он специализирован частично на указатели, но любого типа T.

в вашем примере при использовании is_ptr<int*>::value частичная специализация действительно будет выбрана.

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