/* -------------------------------------------------------------------------- operator.cpp Tekijä: Miika Nurminen Pvm: 8.2.2001, laajennettu 28.11.2007 Tarkoitus: Demonstroida Template-operaattorien käyttöä. -------------------------------------------------------------------------- */ #include #include #include #include #include using namespace std; class B; class A { private: int value; public: A(int a) {value=a;} bool operator==(const A& m) const { return (value==m.value); } bool operator<(const A& m) const { return (value int")); return A(i); } }; A::operator B() const { stringstream a; a << value; // int -> string-muunnos stringstreamilla return B(a.str()); } // yleisten vertailuoperaattorien generointi edellyttää, // että ==/!= ja jokin vertailuoperaattori on määritelty template bool operator<=(const T &a, const T &b) { return ( (a bool operator>(const T &a, const T &b) { return ( (!(a bool operator>=(const T &a, const T &b) { return (!(a bool operator!=(const T &a, const T &b) { return (!(a==b)); } int main(int argc, char* argv[]) { try { A a(2); A b(2); A c(3); if (a<=b) cout << "<= toimii" << endl; if (a==b) cout << "== toimii" << endl; if (c>b) cout << "> toimii" << endl; if (c<=b) cout << "ei toimi" << endl; if (c!=b) cout << "!= toimii" << endl; B d("testi"); B e("toinen"); if (d(a)(a)) cout << "eri tyypit (d B if (g==a) cout << "toimii (\"2\"==2)" << endl; B h("3"); // implisiittinen muunnos A -> B if (h==c) cout << "toimii (3==\"3\")" << endl; // jos B-luokalla ei ole muunnosoperaattoria A:han, // toisin päin verrattaessa tarvitaan eksplisiittinen muunnos if (c==h) cout << "toimii (3==\"3\") (B:n muunnosoperaattori)" << endl; if (static_cast(c)==h) cout << "toimii (3==\"3\") (A:n muunnosoperaattori)" << endl; a = d; // poikkeus! "testi"-merkkijonon muuntaminen numeroksi // ei onnistu } catch (exception& e) { cout << e.what(); } return 0; }