Когда предпочесть обычную перегрузку функции шаблонам (перегрузка)? - PullRequest
0 голосов
/ 26 сентября 2019

Я не могу найти ответ на этот вопрос в Google.

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

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

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

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

Например:

void func(int param)
{
    // ...
}

void func(double param)
{
    // ...
}

void func(char param)
{
    // ...
}

То же самое можно сделать с помощью шаблонов:

template<typename T>
void tmpl(T param)
{
    // ...
}

template<>
void tmpl(double param)
{
    // ...
}

template<>
void tmpl(char param)
{
    // ...
}

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

Так что в этих случаях мы можем просто написать это:

template<typename T>
void tmpl(T param)
{
    // ...
}

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

РЕДАКТИРОВАТЬ: Я нашел этот хороший ответ, который несколько уместенно не охватывает полностью мой вопрос:

1 Ответ

2 голосов
/ 26 сентября 2019

Одно большое различие между специализацией шаблонов и перегрузками заключается в том, что перегрузки допускают неявное преобразование аргументов, а специализации шаблонов - нет.Продолжая ваш пример, как будет обрабатываться аргумент float?func(double param) будет выбран, но будет создан экземпляр общего шаблона.Часто первое верно.

В более общем смысле, есть причины предпочитать не шаблонный код.Шаблоны обычно должны находиться в заголовке, что замедляет компиляцию и предоставляет реализацию всем.Шаблоны вызывают больше загадочных сообщений об ошибках компиляции и не очень хорошо поддерживаются инструментами.Например, Visual Studio 2015 не предоставляет информацию о Intellisense для шаблонов.

...