Перегрузка функций и шаблоны в С++

Вдогонку к вопросу о перегрузке функций:

c++ Используя перегрузку функции написать программу вычисления произведения двух переменных разного типа

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


Ответы (1 шт):

Автор решения: MSDN.WhiteKnight

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

double CalcSum(double x, double y) {
    return x + y;
}

void CalcSum(double x, double y,double& res) {
    res = x + y;
}

Даже если сделать так:

template<typename... Args> double CalcSum(Args...) { return 0; }

template<> double CalcSum<double,double>(double x, double y)
{
    return x + y;
}

template<> double CalcSum<double, double,double&>(double x, double y, double& res)
{
    res = x + y;
    return res;
}

То проблема этого кода (помимо того, что он выглядит ужасно), в том что он все равно не вполне работает как нужно. Если просто писать CalcSum(1.0, 2.0, res), нужная специализация вызываться не будет - нужно писать CalcSum<double, double, double&>(1.0, 2.0, res);...

→ Ссылка