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

Может ли функция шаблона быть перегружена на основе типа указателя, как показано ниже:

1)
template <class T>
void Function(T* ptr, char m)
{
    ...
}

2)
template <class T>
void Function(T i, char m)
{
    ...
}

Это допустимо в C ++?

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

3)
template<>
inline  Function<string>(string sptr, char m)
{
    ...
}

PS: когда я пытаюсь специализироватьсяшаблон 1 с 3 я получаю ошибку компиляции.

Ответы [ 2 ]

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

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

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

Даже ваша специализация на шаблоне функций совершенно верна.

Цитирование cppreference's Шаблон функции

В частности, частичное упорядочение происходит в следующих ситуациях:

  1. разрешение перегрузки для вызова специализации шаблона функции
template<class X> void f(X a);
template<class X> void f(X* a);
int* p;
f(p);
  1. Когда адрес специализации шаблона функции взят
template<class X> void f(X a);
template<class X> void f(X* a);
void (*p)(int*) = &f;
  1. Когда оператор размещения удаляет , который является специализацией шаблона функции, выбирается в соответствии с оператором размещения new
  2. когда объявление функции друга , явное создание экземпляра или явная специализация ссылаются на специализацию шаблона функции
template<class X> void f(X a);  // first template f
template<class X> void f(X* a); // second template f
template<> void f<>(int *a) {} // explicit specialization
 // template argument deduction comes up with two candidates:
 // foo<int*>(int*) and f<int>(int*)
 // partial ordering selects f<int>(int*) as more specialized
1 голос
/ 10 июня 2019

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

...