случай приоритета шаблона функции - PullRequest
1 голос
/ 28 января 2012
template<typename T, size_t length> void f(T (&)[length]){
    cout<<"array"<<endl;
}

template<typename T> void f(T&){
    cout<<"generic"<<endl;
}

template<typename T, typename enable_if<is_array<T>::value, int>::type =0> void f(T&){
    cout<<"generic (is array)"<<endl;
}

Есть ли какой-либо случай (то есть любой T при вызове f<T>()), в котором последняя версия шаблона функции будет предпочтительнее других?

Ответы [ 2 ]

2 голосов
/ 29 января 2012

Нет.Если T является типом массива, первая версия выигрывает у второй и третьей функции (в противном случае вторая и третья функция будут неоднозначными).Если T не является типом массива, третья функция недоступна, благодаря enable_if, а поскольку первая не совпадает, будет использоваться вторая.

0 голосов
/ 29 января 2012

Разрешение перегрузки всегда работает только с аргументами функции, независимо от того, является ли это шаблоном функции или нет. Для шаблонов функций тип возврата используется до разрешения перегрузки при принятии решения о том, является ли шаблон функции кандидатом. По сути, это работает так:

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

В указанном выше случае неограниченная версия f() и версия, для которой разрешено создание только экземпляра, если выведенный тип является T[N], одинаково хороши. То есть, если вы передадите T[N] только этим, вы должны получить двусмысленность. Однако, если аргументы шаблона выводятся так, чтобы соответствовать первой версии, эта версия в любом случае имеет приоритет из-за частичного упорядочения шаблонов функций: в конечном итоге это будет лучшее соответствие.

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