You are on page 1of 3

Bi ny s gii thiu cho bn v template trong c++. 1. Template l g ?

Template ging nh mt "c my" c kh nng sn xut ra cc hm v lp da vo kiu ca cc tham s. Bng cch s dng template, bn c th ch cn thit k 1 lp (hm) m c kh nng thao tc vi nhiu loi d liu khc nhau, thay v bn phi to nhiu lp (hm) khc nhau thao tc vi tng loi d liu khc nhau. V d nh, to mt hm c tc dng ly gi tr nh nht ca 2 s m khng s dng template, bn phi vit cc hm nh sau : // min for ints int min( int a, int b ) return ( a < b ) ? a : b; // min for longs long min( long a, long b ) return ( a < b ) ? a : b; // min for chars char min( char a, char b ) return ( a < b ) ? a : b; //etc... Nhng nu s dng template, bn c th gim s lng hm phi vit xung ch cn mt hm nh sau : template <class T> T min( T a, T b ) return ( a < b ) ? a : b; Nhng tt c nhng ci ta u c th vit m khng cn dng template ! Tt nhin bn hon ton c th vit m m khng cn dng template nhng nu dng template bn c th tit kim c cng sc vit m, tng thm tnh linh ng ca chng trnh v mt iu quan trng l kh nng s dng li cao. Bn cng nn ch l template l type-safe, c ngha l trnh bin dch khng t chuyn kiu (type cast) m bn phi chuyn n 1 cch tng minh. y l prototype chung cho template : template < [typelist] [, [ arglist ]] > declaration decaration phi l mt hm hoc lp. 2. Function template Function template cho php bn to ta cc hm c kh nng thao tc vi bt c i tng no m khng cn overload. Vi function template c c 1 tp hp cc hm da trn mt on m ging nhau nhng li tc ng ln cc i tng khc nhau. Bn c th dng prototype ca function template nh mt trong 2 cch sau : template <class identifier> function_declaration; template <typename identifier> function_declaration; Hai prototype trn c th coi l nh nhau v c dng nh nhau. V d : template <class T> void MySwap( T& a, T& b ){ T c( a ); a = b; b = c; } on m ny nh ngha mt tp hp cc hm c kh nng hon v 2 tham s a vo. T template ny bn c th

to ra cc hm hon chuyn khng ch c kiu int, long m cn c th hon chuyn bt c kiu no, k c cc kiu do bn t nh ngha. Thm vo funtion template s ngn cn bn hon chuyn cc i tng (object)khc kiu, bi v complier kim tra kiu ca cc tham s ngay vo lc bin dch (complie time). Bn c th gi hm funtion template nh mt hm thng thng, khng cn thm bt k c php g c bit, v d : int i, j; char k; MySwap( i, j ); //OK MySwap( i, k ); //Error, different types. Kiu ca cc tham s ca function template cng c th c ch ra mt cch r rng nh sau : template<class T> void f(T) {...} void g(char j) { f<int>(j); //generate the specialization f(int) } Khi kiu ca cc tham s c ch mt cch r rng, s chuyn i kiu s c chuyn mt cch t ng sao cho ph hp, nh v d trn th complier s chuyn (char j) sang kiu int. Khi function template c gi ln u tin cho mt kiu c th, complier to ra mt instantiation (th hin), y l mt phin bn (version) ca template funtion c th cho tng kiu. "Th hin" ny s c gi mi khi function c gi tng ng vi kiu . Nu bn c vi "th hin" ging nhau th ch mt "th hin" duy nht c to ra. 3. Class template Tng t nh function template, bn c th s dng class template to ra tp hp cc lp cng tc ng ln nhiu kiu d liu khc nhau, v d : template <class T, int i> class TempClass { public: TempClass( void ); ~TempClass( void ); int MemberSet( T a, int b ); private: T Tarray[i]; int arraysize; }; Trong v d ny, template class s dng 2 tham s, mt c kiu l T v mt l int. Tham s T c th c truyn vo vi bt c kiu no, k cc cc struct v cc i tng. V d nh khi bn mun to ra mt i tng dng thao tc vi kiu int th bn dng nh sau : TempClass <int> myobject (5, 5); Cn khi bn mun thao tc vi kiu float th bn li khai bo nh sau : TempClass <float> myobject (5, 5); (Tt nhin l cc tham s ca function template v ca class template l linh ng ph thuc vo bn). Cc thnh phn trong class template c nh ngha c khc cht t so vi nhng lp nontemplate : template <class T, int i> int TempClass< T, i >::MemberSet( T a, int b ) { if( ( b >= 0 ) && (b < i) ) {

Tarray[b++] = a; return sizeof( a ); } else return -1; } Templates for Constructors and Destructors template <class T, int i> TempClass< T, i >::TempClass( void ){ TRACE( "TempClass created.\n" ); } template <class T, int i> TempClass< T, i >::~TempClass( void ){ TRACE( "TempClass destroyed.\n" ); } Template khng phi l cc hm, lp thng thng, chng c complie da theo yu cu, c ngha l code ca template function khng c bin dch (complie) cho n khi c mt th hin (instantiation) ca n c i hi (s dng). Ngay lc complier to ra mt hm c th cho kiu d liu c th. Mt s template c sn trong C++ : CArray : template class dng to ra mng vi cc phn t c kiu tu . CArray cung cp cc mng tng t nh mng trong C nhng vi CArray bn c th tng hoc gim s lng cc phn t khi cn thit. Ch s ca mng (array index) lun bt u t 0. Cc truy sut CArray cng tng t nh array trong C. CList : template class dng to ra list vi cc phn t c kiu tu . CList cung cp cc danh sch lin kt i c sp xp. CMap : template class dng to ra "map" vi cc phn t c key v kiu tu . Gi tr key l duy nht trong mt "map". Dng CMap bn c th coi n nh mt cun t in d tra cu 1 cch d dng cc phn t. CTypedPtrArray : template class for type-safe arrays of pointers. CTypedPtrList : template class for type-safe lists of pointers. CTypedPtrMap : template class for type-safe maps with pointers. Ba template class cui cng tng t nh 3 template class trc, ch khc ch "pointer" ;)

You might also like