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

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

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";

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

3

Другие решения

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

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

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

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

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

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

1

По вопросам рекламы [email protected]