Пустые угловые скобки после имени функции в явной специализации - PullRequest
4 голосов
/ 26 июня 2019

Вот код из статьи Почему бы не специализировать шаблоны функций?

template<class T>
void f(T);                     // (1)
template<class T>
void f(T*);                   // (2)
template<>
void f<>(int*);             // (3)

Мой вопрос о последней декларации. Что означает этот синтаксис? Когда мы хотим полностью специализировать шаблон функции, например, (1), для некоторого типа мы обычно пишем:

template<>
void f<int>(int);

т.е. мы помещаем этот тип в угловые скобки после имени функции.

Так, что означает синтаксис (3)?

Ответы [ 2 ]

6 голосов
/ 26 июня 2019

В вашем случае

template<> void f<>(int*);

является явной специализацией

template<class T> void f(T*); 

базовый шаблон. Это так же, как

template<> void f<int>(int*);

выводится только аргумент шаблона.


Вы даже можете написать:

template<> void f(int*);

с тем же эффектом. Аналогичный случай представлен в cppreference , смотрите раздел Явные специализации шаблонов функций , где написано:

При специализации шаблона функции его аргументы шаблона могут быть опущены, если вычет аргументов шаблона может предоставить их из аргументов функции.

Соответствующая часть стандарта C ++: http://eel.is/c++draft/temp.expl.spec#11.

2 голосов
/ 26 июня 2019

Отсутствующий аргумент шаблона будет выведен компилятором, если вы его не предоставите.В этом конкретном случае он будет выведен на int*, потому что второй шаблон более специализирован (но оба являются кандидатами).Так что

template<> void f<>(int*)

станет

template<> void f<int>(int*)

после вычета типа.

...