Функция шаблона и не шаблонная перегрузка этой функции, что лучше всего подходит?

Код выглядит следующим образом:

template <class InputIterator, class OutputIterator>
inline OutputIterator copy(InputIterator first, InputIterator last,
                           OutputIterator result)
{
  return __copy_dispatch<InputIterator,OutputIterator>()(first, last, result);
}

//A overload version
inline char* copy(const char* first, const char* last, char* result) {
  memmove(result, first, last - first);
  return result + (last - first);
}

Если я позвоню copy(int*, int*), что является лучшим соответствием, будет ли компилятор создавать новую функцию, использующую int* в качестве параметра шаблона, или int* будет преобразован в char*,

А что если я позвоню copy(char[], char[]) обратите внимание, я просто использую char[] отметить тип параметров.

2 ответа

Решение

Поскольку int * неявно конвертируется в char * ни к const char *будет вызвана функция шаблона. Удаление функции шаблона приведет к ошибке времени компиляции.

Предложение: очень важно поиграть с компилятором самостоятельно. Вы можете добавить такие строки, как

std::cout << "template function called.\n";

в ваши перегрузки или использовать отладчик, чтобы делать такие вещи. Это отличный учебный опыт. Вы также можете просто прочитать некоторые книги по С ++ для ознакомления.

если я вызываю copy(int*, int*), что является лучшим соответствием,

Там только в одном совпадении: шаблон. Версия взяв const char* не совпадает вообще.

А что если я назову copy(char[], char[])

опять же шаблон выигрывает, потому что аргументы не const, Если вы сделали это:

const char* c1 = ....;
const char* c2 = ....;
copy(c1, c2);

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

Другие вопросы по тегам