Операции с разными типами данных
Пишу шаблонный класс на плюсах. Если задать разные типы для класса (Например double для a и int для b), то будет ошибка. Вопрос: можно ли этого избежать предусмотрев это в классе или обязательно указывать это в main?
//main
#include <iostream>
#include "Rational.h"
using namespace std;
int main()
{
setlocale(LC_ALL, "Russian");
cout << "Число а";
Rational<double> a(9,5);
a.Print();
cout << "Число b";
Rational<int> b(3,10);
b.Print();
a.Plus(b); //<---- ошибка (складываю разные типы)
system("pause");
return 0;
}
//h.
#ifndef RATIONAL_H
#define RATIONAL_H
#include <iostream>
using namespace std;
template <typename T>
class Rational
{
public:
Rational()
{
p = 0;
q = 1;
}
Rational(T p, T q)
{
this->p = p;
this->q = q;
}
~Rational()
{
}
void Print()
{
cout << " = " << p << "/" << q << endl;
}
int GCD(T test_p, T test_q)
{
while (test_p != 0 and test_q != 0)
{
if (test_p > test_q)
{
test_p = test_p % test_q;
}
else
{
test_q = test_q % test_p;
}
}
return (test_p + test_q);
}
Rational Plus(const Rational& arg)
{
cout << "Операция сложения:\n" << p << "/" << q << " + " << arg.p << "/" << arg.q;
T p1, p2, num, denom;
p1 = p * arg.q;
p2 = arg.p * q;
num = p1 + p2;
denom = arg.q * q;
int gcd = GCD(num, denom);
return Show(num / gcd, denom / gcd);
}
Rational Show(T test_p, T test_q)
{
cout << " = " << test_p << "/" << test_q << endl;
return *this;
}
private:
T p, q;
};
#endif
Ответы (1 шт):
Как я понимаю, надо, чтоб сам тип шаблона был только целочисленный...
Если только int - не надо использовать шаблон...
Если могут быть разные целочисленные типы — ну, например, использовать концепты или иные ухищрения.
Например:
template<std::integral T>
class Rational
или
template<typename T, typename = std::enable_if_t<std::is_integral<T>::value>>
class Rational
или
template<typename T>
class Rational
{
static_assert(std::is_integral<T>::value,"Non integral type");
Правда, все равно останутся проблемы при суммировании разных типов — здесь вам нужно будет писать преобразование одного типа в другой...
Кроме того, у вас ряд не то чтобы ошибок, но... GCD — это же явно статическая функция, например. Или конструктор я бы делал так:
Rational(T p = 0, T q = 1):p(p),q(q){}
он же — и конструктор по умолчанию...