Operator Overloading in Templates using C++ programming
Write a simple function template for predicate function isEqualTo that compares its two arguments of the same type with the equality operator (==) and returns true if they are equal and false otherwise. Use this function template in a program that calls isEqualTo only with a variety of fundamental types. Now write a separate version of the program
that calls isEqualTo with a user-defined class type, but does not overload the equality operator. What happens when you attempt to run this program? Now overload the equality operator (with the operator function) operator==. Now what happens when you attempt to run this program?
Answer:
#include <iostream> using namespace std; // function template isEqualTo template < typename T > bool isEqualTo( const T &arg1, const T &arg2 ) { return arg1 == arg2; } // end function isEqualTo // class used to demonstrate overloading operators // is necessary when using templates class Complex { friend ostream &operator<<(ostream &, Complex &); public: // constructor for Fraction Complex( int realPart, int iPart ) : real( realPart ), imaginary( iPart ) { // empty body } // end Complex constructor // Overloaded equality operator. If this is not provided, the // program will not compile. bool operator==( const Complex &right ) const { return real == right.real && imaginary == right.imaginary; } // end overloaded equality operator private: int real; // real part of the complex number int imaginary; // imaginary part of the complex number }; // end class Fraction // overloaded << operator ostream &operator<<( ostream &out, Complex &obj ) { if ( obj.imaginary > 0 ) // positive imaginary out << obj.real << " + " << obj.imaginary << "i"; else if ( obj.imaginary == 0 ) // zero imaginary out << obj.real; else // negative imaginary out << obj.real << " - " << -obj.imaginary << "i"; return out; } // end overloaded << operator int main() { int a; // integers used for int b; // testing equality // test if two ints input by user are equal cout << "Enter two integer values: "; cin >> a >> b; cout << a << " and " << b << " are " << ( isEqualTo( a, b ) ? "equal" : "not equal" ) << '\n'; char c; // chars used for char d; // testing equality // test if two chars input by user are equal cout << "\nEnter two character values: "; cin >> c >> d; cout << c << " and " << d << " are " << ( isEqualTo( c, d ) ? "equal" : "not equal" ) << '\n'; double e; // double values used for double f; // testing equality // test if two doubles input by user are equal cout << "\nEnter two double values: "; cin >> e >> f; cout << e << " and " << f << " are " << ( isEqualTo( e, f ) ? "equal" : "not equal") << '\n'; Complex g( 10, 5 ); // Complex objects used Complex h( 10, 5 ); // for testing equality // test if two Complex objects are equal // uses overloaded << operator cout << "\nThe class objects " << g << " and " << h << " are " << ( isEqualTo( g, h ) ? "equal" : "not equal" ) << '\n'; } // end main
Leave a reply