templates_application.ppt
- Количество слайдов: 16
Ідіоми застосування шаблонів • Traits-шаблони • numeric_limits • char_traits • string Література 1. Эккель Б. , Эллисон Ч. Философия С++, т. 2, гл 5. "Питер", 2004. 2. Вандевурд Д. , Джосатисс Н. Шаблоны С++: справочник разработчика. - М. : "Вильямс", 2003.
Traits-шаблони Traits- (характерні) риси • Traits-шаблон – ідіома інкапсуляції значень множини параметрів стану і методів характерної поведінки з наступним інстанціюванням для фіксованого аргументу шаблону • Статичний поліморфізм включно з даними: для будь-якого значення параметра шаблону – однакове іменування параметрів стану і методів • Спрощення інстанціювання шаблонних типів: параметри стану( може бути значна кількість), як правило, залежать від значення параметра шаблону( найчастіше – одного) • Можливість використання ієрархій типів і значень за замовчуванням prj: Traits
_Num_base struct _CRTIMP 2_PURE _Num_base{// Риси числових типів за замовчуванням _STCONS(float_denorm_style, has_denorm, denorm_absent); _STCONS(bool, has_denorm_loss, false); _STCONS(bool, has_infinity, false); _STCONS(bool, has_quiet_Na. N, false); _STCONS(bool, has_signaling_Na. N, false); _STCONS(bool, is_bounded, false); _STCONS(bool, is_exact, false); _STCONS(bool, is_iec 559, false); _STCONS(bool, is_integer, false); //static const bool is_integer= false; _STCONS(bool, is_modulo, false); _STCONS(bool, is_signed, false); _STCONS(bool, is_specialized, false); _STCONS(bool, tinyness_before, false); _STCONS(bool, traps, false); _STCONS(float_round_style, round_toward_zero); _STCONS(int, digits, 0); _STCONS(int, digits 10, 0); _STCONS(int, max_exponent 10, 0); _STCONS(int, min_exponent 10, 0); _STCONS(int, radix, 0); };
_Num_int_base struct _CRTIMP 2_PURE _Num_int_base : public _Num_base { // Додаткові риси для integer _STCONS(bool, is_bounded, true); _STCONS(bool, is_exact, true); _STCONS(bool, is_integer, true); _STCONS(bool, is_modulo, true); _STCONS(bool, is_specialized, true); _STCONS(int, radix, 2); };
numeric_limits template<class _Ty> class numeric_limits : public _Num_base public: // Шаблон для характерних рис числових типів static _Ty (__CRTDECL min)() _THROW 0(){ // return minimum value return (_Ty(0)); } static _Ty (__CRTDECL max)() _THROW 0(){ // return maximum value return (_Ty(0)); } static _Ty __CRTDECL epsilon() _THROW 0(){ // return smallest effective increment from 1. 0 return (_Ty(0)); }. . }; . . . {
numeric_limits<char> template<> class _CRTIMP 2_PURE numeric_limits<char> : public _Num_int_base{ // limits for type char public: typedef char _Ty; static _Ty (__CRTDECL min)() _THROW 0(){ // return minimum value return (CHAR_MIN); } static _Ty (__CRTDECL max)() _THROW 0(){ // return maximum value return (CHAR_MAX); }. . .
Повернення боргів cout<<"numeric_limits<unsigned char>: : digits=" <<numeric_limits<unsigned char>: : digits <<endl; cout<<"numeric_limits< char>: : digits=" <<numeric_limits< char>: : digits <<endl; cout<<"numeric_limits<unsigned >: : digits=" <<numeric_limits<unsigned >: : digits <<endl; cout<<"numeric_limits<unsigned char>: : min=" <<(int)numeric_limits<unsigned char>: : min()<<endl; cout<<"numeric_limits< char>: : min=" <<(int)numeric_limits< char>: : min() <<endl; cout<<"numeric_limits<unsigned >: : min=" <<(int)numeric_limits<unsigned >: : min() <<endl;
struct char_traits template<class _Elem> struct char_traits: public _Char_traits_base { // properties of a string or stream element typedef _Elem char_type; typedef long int_type; typedef streampos pos_type; typedef streamoff off_type; typedef _Mbstatet state_type; static void __CLRCALL_OR_CDECL assign (_Elem& _Left, const _Elem& _Right) { // assign an element _Left = _Right; }. . . . };
struct char_traits<char> template<> struct _CRTIMP 2_PURE char_traits<char>: public _Char_traits_base { // properties of a string or stream char element typedef char _Elem; typedef _Elem char_type; typedef int_type; typedef streampos pos_type; typedef streamoff off_type; typedef _Mbstatet state_type; static void __CLRCALL_OR_CDECL assign (_Elem& _Left, const _Elem& _Right) { } // assign an element _Left = _Right; . . . .
string template < class Char. Type, class Traits=char_traits<Char. Type>, class Allocator=allocator<Char. Type> > class basic_string; typedef basic_string<char> string;
Базові класи потоків basic_ios _Elem, _Traits basic_istream _Elem, _Traits basic_ostream _Elem, _Traits basic_iostream
ios_base class ios_base: public _Iosb<int> { // base class for ios public: class failure; ios_base& operator=(const ios_base& _Right); operator void *() const {// test if any stream operation has failed return (fail() ? 0 : (void *)this); } bool operator!() const {// test if no stream operation has failed return (fail()); } void clear(iostate _State, bool _Reraise); void clear(iostate _State = goodbit); . . . virtual ~ios_base(); protected: ios_base(); };
ios_base (cont) class ios_base: public _Iosb<int> public: iostate rdstate() const; void setstate(iostate _State); bool good() const; bool eof() const; bool fail() const; bool bad() const; fmtflags(fmtflags _Newfmtflags); fmtflags setf(fmtflags _Newfmtflags, fmtflags _Mask); void unsetf(fmtflags _Mask); streamsize precision() const; streamsize precision(streamsize _Newprecision); streamsize width() const; streamsize width(streamsize _Newwidth); };
class basic_ios template<class _Elem, class _Traits> class basic_ios: public ios_base { // base class for basic_istream/basic_ostream public: typedef basic_ios<_Elem, _Traits> _Myt; typedef basic_ostream<_Elem, _Traits> _Myos; typedef basic_streambuf<_Elem, _Traits> _Mysb; typedef ctype<_Elem> _Ctype; typedef _Elem char_type; typedef _Traits traits_type; typedef typename _Traits: : int_type; typedef typename _Traits: : pos_type; typedef typename _Traits: : off_type; explicit basic_ios(_Mysb *_Strbuf); virtual ~basic_ios(); //. . . protected: basic_ios(); private: basic_ios(const _Myt&); // not defined _Myt& operator=(const _Myt&); // not defined };
class basic_ios (cont) public: . . . void clear(io_state _State); void setstate(io_state _State); _Myos tie() const; _Myos tie(_Myos *_Newtie); _Mysb * rdbuf() const; _Mysb * rdbuf(_Mysb *_Strbuf); _Elem fill() const; _Elem fill(_Elem _Newfill); private: _Mysb *_Mystrbuf; // pointer to stream buffer _Myos *_Tiestr; // pointer to tied output stre _Elem _Fillch; // the fill character };
Визначення базових потоків template <class Elem, class Tr = char_traits<Elem> > class basic_istream : virtual public basic_ios<Elem, Tr>; typedef basic_istream<char, char_traits<char> > istream; template <class Elem, class Tr = char_traits<Elem> > class basic_ostream : virtual public basic_ios<Elem, Tr> ; typedef basic_ostream<char, char_traits<char> > ostream; template <class Elem, class Tr = char_traits<Elem> > class basic_iostream : public basic_istream<Elem, Tr>, public basic_ostream<Elem, Tr> { public: explicit basic_iostream (basic_streambuf<Elem, Tr>& *_Strbuf); virtual ~basic_iostream( ); }; typedef basic_iostream<char, char_traits<char> >
templates_application.ppt