#include<iostream>
#include<string>
#include<sstream>
using namespace std;
class Var
{
enum Type {I, D, S};
int nVar;
double dVar;
string sVar;
Type type;
template <typename T>
string toString(T val);
void DiffString( string& str1, int dl); // реализация математических операций - для строк
void MultString(string& s1, const string& s2); // доступны только для данного класса
void DivString(string& s1, const string& s2);
public:
Var(int n);
Var(double d);
Var(string s);
Var& operator+=(const Var&);
Var& operator-=(const Var&);
Var& operator*=(const Var&);
Var& operator/=(const Var&);
Var operator+ (const Var&);
Var operator- (const Var&);
Var operator* (const Var&);
Var operator/ (const Var&);
bool operator==(const Var&);
bool operator>(const Var&);
bool operator<(const Var&);
bool operator>=(const Var&);
bool operator<=(const Var&);
bool operator!=(const Var&);
void Show() const;
operator int();
operator double();
operator const char*();
};
template <typename T>
string Var::toString(T val)
{
ostringstream oss;
oss<< val;
return oss.str();
}
void Var::DiffString(string& str1, int dl)
{
int t = 0;
if (str1.size() > dl)
t = str1.size() - dl;
str1.resize(t);
}
void Var::MultString(string& s1, const string& s2)
{
string tmp;
for (int i = 0; i < s1.size(); i++)
if (s2.find(s1[i]) != -1)
tmp+=s1[i];
s1 = tmp;
}
void Var::DivString(string& s1, const string& s2)
{
string tmp;
for (int i = 0; i < s1.size(); i++)
if (s2.find(s1[i]) == -1)
tmp+=s1[i];
s1 = tmp;
}
Var::Var(int n = 0)
{
type = I;
nVar = n;
dVar = NULL;
sVar = "";
}
Var::Var(double d)
{
type = D;
nVar = NULL;
dVar = d;
sVar = "";
}
Var::Var(string s)
{
type = S;
nVar = NULL;
dVar = NULL;
sVar = s;
}
Var& Var::operator+=(const Var& V)
{
if (type == I)
{
if (V.type == I)
{
nVar += V.nVar;
return *this;
}
if (V.type == D)
{
nVar += int(V.dVar);
return *this;
}
if (V.type == S)
{
nVar += int((V.sVar).c_str());
return *this;
}
}
if (type == D)
{
if (V.type == I)
{
dVar += double(V.nVar);
return *this;
}
if (V.type == D)
{
dVar += V.dVar;
return *this;
}
if (V.type == S)
{
dVar += double(int((V.sVar).c_str()));
return *this;
}
}
if (type == S)
{
if (V.type == I)
{
sVar += toString(V.nVar);
return *this;
}
if (V.type == D)
{
sVar += toString(V.dVar);
return *this;
}
if (V.type == S)
{
sVar += V.sVar;
return *this;
}
}
}
Var& Var::operator-=(const Var& V)
{
if (type == I)
{
if (V.type == I)
{
nVar -= V.nVar;
return *this;
}
if (V.type == D)
{
nVar -= int(V.dVar);
return *this;
}
if (V.type == S)
{
nVar -= int((V.sVar).c_str());
return *this;
}
}
if (type == D)
{
if (V.type == I)
{
dVar -= double(V.nVar);
return *this;
}
if (V.type == D)
{
dVar -= V.dVar;
return *this;
}
if (V.type == S)
{
dVar -= double(int((V.sVar).c_str()));
return *this;
}
}
if (type == S)
{
if (V.type == I)
{
DiffString(sVar,(toString(V.nVar)).size());
return *this;
}
if (V.type == D)
{
DiffString(sVar,(toString(V.dVar)).size());
return *this;
}
if (V.type == S)
{
DiffString(sVar,(V.sVar).size());
return *this;
}
}
}
Var& Var::operator*=(const Var& V)
{
if (type == I)
{
if (V.type == I)
{
nVar *= V.nVar;
return *this;
}
if (V.type == D)
{
nVar *= int(V.dVar);
return *this;
}
if (V.type == S)
{
nVar *= int((V.sVar).c_str());
return *this;
}
}
if (type == D)
{
if (V.type == I)
{
dVar *= double(V.nVar);
return *this;
}
if (V.type == D)
{
dVar *= V.dVar;
return *this;
}
if (V.type == S)
{
dVar *= double(int((V.sVar).c_str()));
return *this;
}
}
if (type == S)
{
if (V.type == I)
{
MultString(sVar,toString(V.nVar));
return *this;
}
if (V.type == D)
{
MultString(sVar, toString(V.dVar));
return *this;
}
if (V.type == S)
{
MultString(sVar, V.sVar);
return *this;
}
}
}
Var& Var::operator/=(const Var& V)
{
if (type == I)
{
if (V.type == I)
{
if (!V.nVar)
{
cout<<"Деление на 0!\n";
return *this;
}
nVar /= V.nVar;
return *this;
}
if (V.type == D)
{
if (!V.dVar)
{
cout<<"Деление на 0!\n";
return *this;
}
nVar /= int(V.dVar);
return *this;
}
if (V.type == S)
{
if (!int((V.sVar).c_str()))
{
cout<<"Деление на 0!\n";
return *this;
}
nVar /= int((V.sVar).c_str());
return *this;
}
}
if (type == D)
{
if (V.type == I)
{
if (!V.nVar)
{
cout<<"Деление на 0!\n";
return *this;
}
dVar /= double(V.nVar);
return *this;
}
if (V.type == D)
{
if (!V.dVar)
{
cout<<"Деление на 0!\n";
return *this;
}
dVar /= V.dVar;
return *this;
}
if (V.type == S)
{
if (!int((V.sVar).c_str()))
{
cout<<"Деление на 0!\n";
return *this;
}
dVar /= double(int((V.sVar).c_str()));
return *this;
}
}
if (type == S)
{
if (V.type == I)
{
DivString(sVar, toString(V.nVar));
return *this;
}
if (V.type == D)
{
DivString(sVar, toString(V.dVar));
return *this;
}
if (V.type == S)
{
DivString(sVar, V.sVar);
return *this;
}
}
}
Var Var::operator+ (const Var& V)
{
if (type == I)
{
if (V.type == I)
{
return Var(nVar + V.nVar);
}
if (V.type == D)
{
return Var(nVar + int(V.dVar));
}
if (V.type == S)
{
return Var(nVar + int((V.sVar).c_str()));
}
}
if (type == D)
{
if (V.type == I)
{
return Var(dVar + double(V.nVar));
}
if (V.type == D)
{
return Var(dVar + V.dVar);
}
if (V.type == S)
{
return Var(dVar + double(int((V.sVar).c_str())));
}
}
if (type == S)
{
if (V.type == I)
{
return Var(sVar + toString(V.nVar));
}
if (V.type == D)
{
return Var(sVar + toString(V.dVar));
}
if (V.type == S)
{
return (sVar + V.sVar);
}
}
}
Var Var::operator- (const Var& V)
{
if (type == I)
{
if (V.type == I)
{
return Var(nVar - V.nVar);
}
if (V.type == D)
{
return Var(nVar - int(V.dVar));
}
if (V.type == S)
{
return Var(nVar - int((V.sVar).c_str()));
}
}
if (type == D)
{
if (V.type == I)
{
return Var(dVar - double(V.nVar));
}
if (V.type == D)
{
return Var(dVar - V.dVar);
}
if (V.type == S)
{
return Var(dVar - double(int((V.sVar).c_str())));
}
}
if (type == S)
{
string tmp = sVar;
if (V.type == I)
{
DiffString(tmp, (toString(V.nVar)).size());
return Var(tmp);
}
if (V.type == D)
{
DiffString(tmp, (toString(V.dVar)).size());
return Var(tmp);
}
if (V.type == S)
{
DiffString(tmp, V.sVar.size());
return (tmp);
}
}
}
Var Var::operator* (const Var& V)
{
if (type == I)
{
if (V.type == I)
{
return Var(nVar * V.nVar);
}
if (V.type == D)
{
return Var(nVar * int(V.dVar));
}
if (V.type == S)
{
return Var(nVar * int((V.sVar).c_str()));
}
}
if (type == D)
{
if (V.type == I)
{
return Var(dVar * double(V.nVar));
}
if (V.type == D)
{
return Var(dVar * V.dVar);
}
if (V.type == S)
{
return Var(dVar * double(int((V.sVar).c_str())));
}
}
if (type == S)
{
string tmp = sVar;
if (V.type == I)
{
MultString(tmp, toString(V.nVar));
return Var(tmp);
}
if (V.type == D)
{
MultString(tmp, toString(V.dVar));
return Var(tmp);
}
if (V.type == S)
{
MultString(tmp, V.sVar);
return (tmp);
}
}
}
Var Var::operator/ (const Var& V)
{
if (type == I)
{
if (V.type == I)
{
if (!V.nVar)
{
cout<<"Деление на 0!\n";
return Var();
}
return Var(nVar / V.nVar);
}
if (V.type == D)
{
if (!V.dVar)
{
cout<<"Деление на 0!\n";
return Var();
}
return Var(nVar / int(V.dVar));
}
if (V.type == S)
{
if (!int((V.sVar).c_str()))
{
cout<<"Деление на 0!\n";
return Var();
}
return Var(nVar / int((V.sVar).c_str()));
}
}
if (type == D)
{
if (V.type == I)
{
if (!V.nVar)
{
cout<<"Деление на 0!\n";
return Var();
}
return Var(dVar / double(V.nVar));
}
if (V.type == D)
{
if (!V.dVar)
{
cout<<"Деление на 0!\n";
return Var();
}
return Var(dVar / V.dVar);
}
if (V.type == S)
{
if (!int((V.sVar).c_str()))
{
cout<<"Деление на 0!\n";
return Var();
}
return Var(dVar / double(int((V.sVar).c_str())));
}
}
if (type == S)
{
string tmp = sVar;
if (V.type == I)
{
DivString(tmp, toString(V.nVar));
return Var(tmp);
}
if (V.type == D)
{
DivString(tmp, toString(V.dVar));
return Var(tmp);
}
if (V.type == S)
{
DivString(tmp, V.sVar);
return (tmp);
}
}
}
bool Var::operator==(const Var& V)
{
if (type == I)
{
if (V.type == I)
return (nVar == V.nVar);
if (V.type == D)
return (nVar == int(V.dVar));
if (V.type == S)
return (nVar == int((V.sVar).c_str()));
}
if (type == D)
{
if (V.type == I)
return (dVar == double(V.nVar));
if (V.type == D)
return (dVar == V.dVar);
if (V.type == S)
return (dVar == double(int((V.sVar).c_str())));
}
if (type == S)
{
if (V.type == I)
return (sVar == toString(V.nVar));
if (V.type == D)
return (sVar == toString(V.dVar));
if (V.type == S)
return (sVar == V.sVar);
}
}
bool Var::operator>(const Var& V)
{
if (type == I)
{
if (V.type == I)
return (nVar > V.nVar);
if (V.type == D)
return (nVar > int(V.dVar));
if (V.type == S)
return (nVar > int((V.sVar).c_str()));
}
if (type == D)
{
if (V.type == I)
return (dVar > double(V.nVar));
if (V.type == D)
return (dVar > V.dVar);
if (V.type == S)
return (dVar > double(int((V.sVar).c_str())));
}
if (type == S)
{
if (V.type == I)
return (sVar > toString(V.nVar));
if (V.type == D)
return (sVar > toString(V.dVar));
if (V.type == S)
return (sVar > V.sVar);
}
}
bool Var::operator<(const Var& V)
{
if (type == I)
{
if (V.type == I)
return (nVar < V.nVar);
if (V.type == D)
return (nVar < int(V.dVar));
if (V.type == S)
return (nVar < int((V.sVar).c_str()));
}
if (type == D)
{
if (V.type == I)
return (dVar < double(V.nVar));
if (V.type == D)
return (dVar < V.dVar);
if (V.type == S)
return (dVar < double(int((V.sVar).c_str())));
}
if (type == S)
{
if (V.type == I)
return (sVar < toString(V.nVar));
if (V.type == D)
return (sVar < toString(V.dVar));
if (V.type == S)
return (sVar < V.sVar);
}
}
bool Var::operator>=(const Var& V)
{
if (type == I)
{
if (V.type == I)
return (nVar >= V.nVar);
if (V.type == D)
return (nVar >= int(V.dVar));
if (V.type == S)
return (nVar >= int((V.sVar).c_str()));
}
if (type == D)
{
if (V.type == I)
return (dVar >= double(V.nVar));
if (V.type == D)
return (dVar >= V.dVar);
if (V.type == S)
return (dVar >= double(int((V.sVar).c_str())));
}
if (type == S)
{
if (V.type == I)
return (sVar >= toString(V.nVar));
if (V.type == D)
return (sVar >= toString(V.dVar));
if (V.type == S)
return (sVar >= V.sVar);
}
}
bool Var::operator<=(const Var& V)
{
if (type == I)
{
if (V.type == I)
return (nVar <= V.nVar);
if (V.type == D)
return (nVar <= int(V.dVar));
if (V.type == S)
return (nVar <= int((V.sVar).c_str()));
}
if (type == D)
{
if (V.type == I)
return (dVar <= double(V.nVar));
if (V.type == D)
return (dVar <= V.dVar);
if (V.type == S)
return (dVar <= double(int((V.sVar).c_str())));
}
if (type == S)
{
if (V.type == I)
return (sVar <= toString(V.nVar));
if (V.type == D)
return (sVar <= toString(V.dVar));
if (V.type == S)
return (sVar <= V.sVar);
}
}
bool Var::operator!=(const Var& V)
{
if (type == I)
{
if (V.type == I)
return (nVar != V.nVar);
if (V.type == D)
return (nVar != int(V.dVar));
if (V.type == S)
return (nVar != int((V.sVar).c_str()));
}
if (type == D)
{
if (V.type == I)
return (dVar != double(V.nVar));
if (V.type == D)
return (dVar != V.dVar);
if (V.type == S)
return (dVar != double(int((V.sVar).c_str())));
}
if (type == S)
{
if (V.type == I)
return (sVar != toString(V.nVar));
if (V.type == D)
return (sVar != toString(V.dVar));
if (V.type == S)
return (sVar != V.sVar);
}
}
void Var::Show() const
{
if (type == I)
cout<<"Тип переменной: int. Значение: "<<nVar<<endl;
if (type == D)
cout<<"Тип переменной: double. Значение: "<<dVar<<endl;
if (type == S)
cout<<"Тип переменной: string. Значение: "<<sVar<<endl;
}
Var::operator int()
{
if (type == I)
return nVar;
if (type == D)
return int(dVar);
if (type == S)
return int(sVar.c_str());
}
Var::operator double()
{
if (type == I)
return double(nVar);
if (type == D)
return dVar;
if (type == S)
return double(int(sVar.c_str()));
}
Var::operator const char*()
{
if (type == I)
{
string tmp = toString(nVar);
return tmp.c_str();
}
if (type == D)
{
string tmp = toString(dVar);
return tmp.c_str();;
}
if (type == S)
return sVar.c_str();
}
int main()
{
// SetConsoleCP (1251);
// SetConsoleOutputCP (1251);
Var a(123456), b(2), f(0);
cout<<"a = ";
a.Show();
cout<<"b = ";
b.Show();
cout<<"f = ";
f.Show();
cout<<"(a!=b)"<<(a!=b)<<endl;
cout<<"(a<=b)"<<(a<=b)<<endl;
cout<<"int(a) "<<int(a)<<endl;
cout<<"double(a) "<<double(a)<<endl;
cout<<"char*(a) "<<(const char*)a<<endl;
return 0;
}