Шаблоны и перегрузка функций
Задали в нашем великолепном вузе задание: Описать функцию, находящую площадь кольца, заключенного между двумя окружностями с общим центром и радиусами R1 и R2. R1, R2 могут быть int или float. Решил вот так: `
#include <math.h>
#include <iostream>
using namespace std;
const double pi = 3.14;
template <class type>
type overload(type parab, type parbb)
{
static int result;
result = (pi * pow(par1, 2)) - (pi * pow(par2, 2));
return result;
}
int main()
{
int ri1 = 10, ri2 = 7;
float rf1 = 4.5, rf2 = 3.5;
cout << overload(ri1, ri2) << endl;
cout << overload(ri1, rf1) << endl;
cout << overload(rf1, ri2) << endl;
cout << overload(rf1, rf2) << endl;
system("pause");
return 0;
}
` Когда вывожу функцию с разными параметрами, float и int или наоборот, сообщает что в шаблоне отсутствуют необходимые экземпляры, подскажите в чем тут проблема?
Ответы (1 шт):
Ваше решение бессмысленно, потому что множить, например, на pi и выдавать значение int - странно, не находите?
Решить ваши затруднения можно так:
template <typename T, typename U>
std::common_type_t<T,U> overload(T a, U b)
{
using R = std::common_type_t<T,U>;
return R(pi) * (a*a-b*b);
}
Т.е. просто все приводить к одному типу, результирующему типу для арифметических операторов.
Правда, не вижу большого смысла в таком решении, если pi у вас задано безусловно, как double, а для int станет тройкой... (Кстати, 3.14 - это что за приближение? хотя бы 3.1415926535898)
Поэтому реально я бы предложил работать просто с double - и неважно, какие типы на входе :)
double overload(double a, double b)
{
return pi*(a*a-b*b);
}
И последнее - судя по названию, может, вам для препода нужен не шаблон, а перегрузка? Определите две функции с разными параметрами - для float, для int (с другим "пи" :))...
Ну, а шаблонное решение представлено выше.