Войти

Показать полную графическую версию : перегруженные шаблоны


papam
27-11-2005, 12:36
Как написать перегруженные шаблоны функций для нахождения корней линейного (а*х + в = 0) и квадратного (а * (х*х) + в * х + с = 0) уравнений.
Замечание: в функции передаются коэффициенты уравнений.

pva
28-11-2005, 11:29
А смысл писать шаблон? Перегрузной гораздо правильней получается.

// шаблон
template<typename X> std::vector<X> polynom2_roots(X a X b, X c)
{
std::vector<X> result;

X det = b*b - 4*a*c;

if (X()<=det)
{
det = std::sqrt(det);
result.push_back((det-b)/(a*2));

if (X()<det)
{
result.push_back((-det-b)/(a*2));
}
}

return result;
}

template<typename X> std::vector<std::complex<X> > polynom2_roots(std::complex<X> a std::complex<X> b, std::complex<X> c)
{
std::vector<std::complex<X> > result;

X det = std::sqrt(b*b - 4*a*c);

result.push_back((-b+det)/(a*2));

if (X()!=det)
{
result.push_back((-det-b)/(a*2));
}

return result;
}

// При компиляции могут возникать неопределённости при выборе параметров шаблона.
// Если убрать все template<...> и заменить X на double, мне кажется получится лучше.
// Если задача стоит математическая (не сугубо прикладная), то использование std::complex<double>
// просто идеально для машин P-4

Если не нужно делать выбор более подходящего алгоритма для решения линейной и квадратичной задачи, то можно задать параметры по умолчанию и поменять порядок аргументов:

template<...> ... polynom2_roots(X c, X b, X a=X());

Для выбора алгоритма, внутри можно добавить:

if (a==X()) // линейное уравнение
else // квадратичное

Можно сделать так, чтобы выбор алгоритма выполнялся статически (тогда если вдруг по ходу выполнения программы окажется что a=0, будет всё равно решаться полное уравнение).
[code]
template<...> ... polynom2_roots(X c, X b, X a); // квадратичное
template<...> ... polynom2_roots(X c, X b); // линейное
[code]




© OSzone.net 2001-2012