Утилита (C ++) - Utility (C++)

утилита Бұл тақырып файлы ішінде C ++ стандартты кітапханасы. Бұл файлда екі негізгі компонент бар:

  • rel_ops, а аттар кеңістігі үшін әдепкі әрекетті анықтайтын шаблондар жиынтығын қамтиды реляциялық операторлар !=, >, <=, және >= пайдаланушы анықтайтын операторларға негізделген бірдей типтегі объектілер арасында == және <.
  • жұп, екі мүшелік нысанды сақтайтын контейнер үлгісі (бірінші және екінші) ерікті тип (тер). Сонымен қатар, тақырып тақырыптық қатынас операторларын анықтайды жұпекі типке де ие.

rel_ops

GCC Іске асыру туралы мәлімдейді rel_ops ат кеңістігі (ішіне салынған аттар кеңістігі std) келесі тәртіппен:[1]

аттар кеңістігі rel_ops {	шаблон <сынып _Tp> кезекте bool оператор !=(const _Tp& __х, const _Tp& __y) { қайту !(__х == __y); }	шаблон <сынып _Tp> кезекте bool оператор  >(const _Tp& __х, const _Tp& __y) { қайту   __y < __х;   }	шаблон <сынып _Tp> кезекте bool оператор <=(const _Tp& __х, const _Tp& __y) { қайту !(__y < __х);  }	шаблон <сынып _Tp> кезекте bool оператор >=(const _Tp& __х, const _Tp& __y) { қайту !(__х < __y);  }	}

Келесі декларациясын қарастырайық А класы, теңдікті және басқа типтегі объектілермен салыстыру үшін операторларға қарағанда азды анықтайды:

сынып A {	int ғимарат;	int бөлме;қоғамдық:	bool оператор ==(const A& басқа) const {		қайту (ғимарат == басқа.ғимарат) && (бөлме == басқа.бөлме);		}	bool оператор <(const A& басқа) const {		қайту (ғимарат < басқа.ғимарат) ||		   (!(басқа.ғимарат < ғимарат) && (бөлме < басқа.бөлме));		}	};жарамсыз f1(const A& a1, const A& a2) {	bool тең = (a1 == a2);       // А сыныбында анықталған == пайдаланады	bool тең емес = (a1 != a2);       // қате: ‘оператор! =’ үшін ‘a1! = a2’ сәйкес келмейді	bool Аздау = (a1 < a2);         // А сыныбында анықталған <қолданады	bool үлкенірек = (a1 > a2);          // қате: ‘a1> a2’ ішіндегі ‘оператор>’ үшін сәйкес келмейді	bool кем_тең = (a1 <= a2);      // қате: ‘оператор <=’ үшін ‘a1 <= a2’ -де сәйкес келмейді	bool үлкен_тең = (a1 >= a2);   // қате: ‘оператор> =’ үшін ‘a1> = a2’ сәйкес келмейді	}

Шақыру арқылы rel_ops шаблондардың көмегімен қалған реляциялық операторларға әдепкі мағынаны беруге болады. Алайда, егер типке ұқсас (яғни шаблон емес) ұқсас оператор ағымдағы ауқымда болса, тіпті класс анықтамасынан тыс болса да, компилятор оның орнына оны қалайды.

// (жоғарыдан жалғасы)# қосу <utility>қолдану аттар кеңістігі std::rel_ops;// төменде оператор rel_ops ауыстырадыbool оператор >=(const A& a1, const A& a2) {	басқа_бірдеңе();      // кейбір ерекшеленетін жанама әсерлерді орындау	қайту !(a1 < a2);             // бірақ әйтпесе rel_ops сияқты процедураны қолданыңыз	};жарамсыз f2(const A& a1, const A& a2) {	bool тең = (a1 == a2);         // А класында анықталған == операторын қолданады	bool тең емес = (a1 != a2);        // rel_ops үшін! (a1 == a2) қолданады	bool Аздау = (a1 < a2);           // А класында анықталған <операторын қолданады	bool үлкенірек = (a1 > a2);           // rel_ops үшін (a2 	bool кем_тең = (a1 <= a2);       // rel_ops үшін! (a2 	bool үлкен_тең = (a1 >= a2); // жоғарыда анықталған жаһандық оператор> = пайдаланады	}

Әрине, келесілерді бірге айтуға болады rel_ops, бастап барлық реляциялық операторларды шығаруға мүмкіндік береді <:

шаблон <сынып _Tp> кезекте bool оператор ==(const _Tp& __х, const _Tp& __y) { қайту !(__х < __y || __y < __х);  }

жұп

Нысан, мысалы, ретінде жарияланды std::жұп<int, жүзу> екі мүшеден тұрады, int бірінші; және жүзу екінші;, плюс үш конструктор функциясы.

Бірінші (әдепкі) конструктор екі мүшені де әдепкі мәндермен инициализациялайды 0 және 0.0, ал екіншісі әр типтің бір параметрін қабылдайды. Үшіншісі - кез-келгенін қабылдайтын шаблон көшірмесін жасаушы std::жұп<_U1, _U2>түрлері қарастырылған _U1 және _U2 қабілетті жасырын түрлендіру дейін int және жүзу сәйкесінше.

GCC-тің іске асырылуы анықтайды жұп механизмі келесідей.[2]

шаблон<сынып _T1, сынып _T2> құрылым жұп {	typedef _T1 бірінші_түр;	typedef _T2 екінші_түр;	_T1 бірінші;	_T2 екінші;	жұп(): бірінші(), екінші() { }	жұп(const _T1& __а, const _T2& __б): бірінші(__а), екінші(__б) { }	шаблон<сынып _U1, сынып _U2> жұп(const жұп<_U1, _U2>& __p) : бірінші(__p.бірінші), екінші(__p.екінші) { }	};

Сонымен қатар, бұл тақырып барлық реляциялық операторлардың барлығын анықтайды жұп екі типке де ортақ даналар. Бұлар типті объектілерге қатаң әлсіз тәртіпті анықтайды std::жұп<_T1, _T2>, негізінде бірінші элементтері, содан кейін екінші элементтері тек бірінші біреуі тең.

// жоғарыдан жалғастышаблон<сынып _T1, сынып _T2> кезекте bool оператор ==(const жұп<_T1, _T2>& __х, const жұп<_T1, _T2>& __y)	{ қайту __х.бірінші == __y.бірінші && __х.екінші == __y.екінші; }шаблон<сынып _T1, сынып _T2> кезекте bool оператор  <(const жұп<_T1, _T2>& __х, const жұп<_T1, _T2>& __y)	{ қайту __х.бірінші < __y.бірінші || (!(__y.бірінші < __х.бірінші) && __х.екінші < __y.екінші); }шаблон<сынып _T1, сынып _T2> кезекте bool оператор !=(const жұп<_T1, _T2>& __х, const жұп<_T1, _T2>& __y)	{ қайту !(__х == __y); }шаблон<сынып _T1, сынып _T2> кезекте bool оператор >(const жұп<_T1, _T2>& __х, const жұп<_T1, _T2>& __y)	{ қайту __y < __х; }шаблон<сынып _T1, сынып _T2> кезекте bool оператор<=(const жұп<_T1, _T2>& __х, const жұп<_T1, _T2>& __y)	{ қайту !(__y < __х); }шаблон<сынып _T1, сынып _T2> кезекте bool оператор>=(const жұп<_T1, _T2>& __х, const жұп<_T1, _T2>& __y)	{ қайту !(__х < __y); }

Сонымен қатар, тақырыпта шаблон-функция бар make_pair () параметрлер бойынша оның қайтару түрін шығаратын:

// жоғарыдан жалғастышаблон<сынып _T1, сынып _T2> кезекте жұп<_T1, _T2> жасау_жұп(_T1 __х, _T2 __y)	{ қайту жұп<_T1, _T2>(__х, __y); }

Пайдаланылған әдебиеттер

  1. ^ Авторлық құқық (C) 2001, 2002, 2004, 2005, 2008 Free Software Foundation, Inc.; астында қол жетімді GNU жалпыға ортақ лицензиясы, 3 нұсқасы және одан кейінгі нұсқасы. Құжаттар онлайн режимінде <https://gcc.gnu.org/onlinedocs/libstdc++/libstdc++-html-USERS-4.4/a00897.html >
  2. ^ Id., <https://gcc.gnu.org/onlinedocs/libstdc++/libstdc++-html-USERS-4.4/a00894.html >
  • ISO / IEC 14882: 2011 спецификациясының жобасы (PDF). б. 508, § 20.

Сыртқы сілтемелер

Сондай-ақ қараңыз