Templates eru partur af C++, fjölhæf og geta leyst vandamál varðandi endurnotkun klasa. Þessi grein byggir á eldri grein um skilgreiningu á röðun punkta, Punktar. Þar er tekið á almennri röðun punkta, hérna er sami klasi færður í Template form.
Ástæðan fyrir því að færa punktaklasa í þetta form er til að spara kóðunarvinnu ásamt því að koma með alhliða punktklasa. Hann þarf að vinna með tölur af mismunandi gerðum, td. integer eða float, og geta unnið með mismunandi gerðir af punktum í einni aðgerð.
Sem dæmi uppfylla:
(type float)Punktur != (type int)Punktur
Hugmyndin er að líkja eftir flestum eiginleikum punkta í stærðfræðinni, án þess að þurfa búa til nýjan klasa fyrir hverja gerð af tölum sem eru notaðar. Frá fyrri grein er punktur skilgreindur sem:
class Point { public: float x,y,z; // Operators ... +,-,*,==,!=,<,> // .... };
template< class T > class Point { public: T x,y,z; // Operators ... +,-,*,==,!=,<,> // .... };
bool Point::operator<( const Point<T> & rhs){ if( (x > rhs.x) || ( (x == rhs.x) && (y > rhs.y) ) || ( (x == rhs.x) && (y == rhs.y) && (z > rhs.z) ) || ( (x == rhs.x) && (y == rhs.y) && (z == rhs.z) ) ) return false; return true; }; bool Point::operator==( const Point<T> & rhs){ if( (x == rhs.x) && (y == rhs.y) && (z == rhs.z) ) return false; return true; };
Point::Point( const Point<int> & rhs){ x=rhs.x; y=rhs.y; z=rhs.z; }; Point::Point( const Point<float> & rhs){ x=rhs.x; y=rhs.y; z=rhs.z; };
template< class T > class Point { public: // vars.. Point::Point( const Point<T> & rhs); Point::Point( const Point<int> & rhs); Point::Point( const Point<float> & rhs); // other.. }; // some main.. Point<double> DPoint; // Ok: no Point( const Point<double> & rhs); Point<int> IPoint; // Error: Already defined Point( const Point<int> & rhs); Point<float> FPoint; // Error: Already defined Point( const Point<float> & rhs);
Point<int> IPoint; Point<float> FPoint; IPoint.x = 2; FPoint.x = 2.5; if( IPoint == FPoint ) // 2 == 2 -> true //... do something
operator==( IPoint, (Point<int>)FPoint )
eða
IPoint.operator==( (Point<int>)FPoint )
FPoint verður neyddur til int, og þar með verður FPoint.x að heiltöluinni 2. Þá verður if setningin sönn, punktarnir eru þeir “sömu” í heiltöluformi, ef FPoint == IPoint, þá væri if setningin fölsk, 2.5 == 2 -> false.
Frá þessu er hægt að gera ýmsar gerðir af punktur eða vektorum, sem geta leyst ekki einungis þrívíð vandamál, líka margvíð vandamál.
Kv. lain