Почему это не частичная специализация шаблона функции? - PullRequest
0 голосов
/ 29 июня 2019

Рассмотрим следующий код:

template<typename T>
void func(T);
template<typename T>
void func(T*); // an overload

Я знаю, что второе объявление является перегрузкой, а не частичной специализацией:

template<typename T>
void func<T*>(T*); // not allowed by C++ standard

Но мне интересно, чем она отличается от частичной специализации? Это дает нам ту же функциональность, что и частичная специализация, не так ли?

1 Ответ

1 голос
/ 29 июня 2019

Но мне интересно, чем она отличается от частичной специализации?

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

С перегрузкой функции этого не происходит.Вместо этого используется механизм разрешения перегрузки.

Различные средства для достижения одних и тех же целей.

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

Это дает нам ту же функциональность, что и частичная специализация, не так ли?

Возможно, есть случаи, когда частичная специализацияможет сделать что-то более удобное, чем перегрузка, но они, вероятно, основаны на SFINAE или других приемах метапрограммирования.Да, частичная специализация может делать большую часть того, что делает перегрузка.

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

Так что будут правила о том, как перегрузка работает с функциями шаблона, несмотря ни на что.

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

...