// spec.cpp - demonstrate class templates // class pair is now specialized for ints (in a silly way) // member function left is now specialized for doubles #include //----< generic pair class >----------------------------------- template class pair { public: pair(const L& larg, const R& rarg) : lft(larg), rgt(rarg) { } L left() const; // { return lft; } R right() const { return rgt; } void left(const L& larg) { lft = larg; } void right(const R& rarg) { rgt = rarg; } private: L lft; R rgt; }; //----< specialized pair class for ints >---------------------- class pair { public: pair (const int& larg, const int& rarg) : lft(larg), rgt(rarg) { cout << " specialized constr for int\n"; } int left() const { return lft; } int right() const { return rgt; } void left(const int& larg) { lft = larg; } void right(const int& rarg) { rgt = rarg; } private: int lft; int rgt; }; //----< generic left member function >------------------------- template L pair::left() const { return lft; } //----< specialized left member function for doubles >--------- double pair::left() const { cout << " specialized left for doubles\n"; return lft; } //----< generic function returning pairs >--------------------- pair funct(int x, double y) { pair temp(2*x,x+y); return temp; } /* */ //----< test stub for specialized template based class >------- void main() { cout << "Demonstrating Template Classes - pair\n" << "==========================================\n\n"; int x = 3; double y = 5.555; // pair myPair; compiler won't generate default // ctor because another ctor was // defined. See Stroustrup, pg 570 // myPair = funct(x,y); So this doesn't work cout << " funct returned myPair(" << funct(x,y).left() << ", " << funct(x,y).right() << ")" << endl<< endl; pair myInts(2,3); myInts.left(); pair myDbls(2.5,3.5); myDbls.left(); }