Yardımcı Program (C ++) - Utility (C++)

Yarar bir başlık dosyası içinde C ++ Standart Kitaplığı. Bu dosyanın iki temel bileşeni vardır:

  • rel_ops, bir ad alanı için varsayılan davranışı tanımlayan bir dizi şablon içeren ilişkisel operatörler !=, >, <=, ve >= kullanıcı tanımlı operatörlere göre aynı türdeki nesneler arasında == ve <.
  • çift, iki üye nesneyi (ilk ve ikinci) keyfi tür (ler). Ek olarak, başlık, varsayılan ilişkisel operatörleri tanımlar. çifther iki türü de ortak olan.

rel_ops

GCC ′ Uygulaması, rel_ops ad alanı (iç içe ad alanı std) aşağıdaki şekilde:[1]

ad alanı rel_ops {	şablon <sınıf _Tp> Çizgide bool Şebeke !=(sabit _Tp& __x, sabit _Tp& __y) { dönüş !(__x == __y); }	şablon <sınıf _Tp> Çizgide bool Şebeke  >(sabit _Tp& __x, sabit _Tp& __y) { dönüş   __y < __x;   }	şablon <sınıf _Tp> Çizgide bool Şebeke <=(sabit _Tp& __x, sabit _Tp& __y) { dönüş !(__y < __x);  }	şablon <sınıf _Tp> Çizgide bool Şebeke >=(sabit _Tp& __x, sabit _Tp& __y) { dönüş !(__x < __y);  }	}

Aşağıdaki beyanı düşünün a sınıfı, eşitlik ve küçüktür operatörlerini aynı türdeki diğer nesnelerle karşılaştırma için tanımlayan:

sınıf Bir {	int bina;	int oda;halka açık:	bool Şebeke ==(sabit Bir& diğer) sabit {		dönüş (bina == diğer.bina) && (oda == diğer.oda);		}	bool Şebeke <(sabit Bir& diğer) sabit {		dönüş (bina < diğer.bina) ||		   (!(diğer.bina < bina) && (oda < diğer.oda));		}	};geçersiz f1(sabit Bir& a1, sabit Bir& a2) {	bool eşit = (a1 == a2);       // A sınıfı içinde tanımlanan == kullanır	bool eşit değil = (a1 != a2);       // hata: "a1! = a2" de "operatör! =" ile eşleşme yok	bool Daha az = (a1 < a2);         // A sınıfı içinde tanımlanan 	bool daha büyük = (a1 > a2);          // hata: "a1> a2" de "operatör>" için eşleşme yok	bool less_equal = (a1 <= a2);      // hata: "a1 <= a2" de "operatör <=" için eşleşme yok	bool great_equal = (a1 >= a2);   // hata: "a1> = a2" içindeki "operatör> =" ile eşleşme yok	}

Çağırarak rel_ops şablonlar, kalan ilişkisel operatörlere varsayılan bir anlam atanabilir. Ancak, geçerli kapsamda benzer bir türe özgü (yani şablon olmayan) operatör varsa, sınıf tanımının dışında bile, derleyici bunun yerine bunu tercih edecektir.

// (yukarıdan devam)#Dahil etmek <utility>kullanma ad alanı std::rel_ops;// aşağıdaki operatör rel_ops'un yerini alırbool Şebeke >=(sabit Bir& a1, sabit Bir& a2) {	başka bir şey yap();      // bazı ayırt edici yan etkiler gerçekleştirin	dönüş !(a1 < a2);             // ancak aksi takdirde rel_ops ile aynı prosedürü kullanın	};geçersiz f2(sabit Bir& a1, sabit Bir& a2) {	bool eşit = (a1 == a2);         // operatör kullanır == A sınıfı içinde tanımlanan	bool eşit değil = (a1 != a2);        // rel_ops başına! (a1 == a2) kullanır	bool Daha az = (a1 < a2);           // 	bool daha büyük = (a1 > a2);           // rel_ops başına (a2 	bool less_equal = (a1 <= a2);       // rel_ops başına! (a2 	bool great_equal = (a1 >= a2); // global operatör kullanır> = yukarıda tanımlanmıştır	}

Elbette aşağıdakiler ile birlikte beyan edilebilir: rel_ops, tüm ilişkisel operatörlerin <:

çift

Örneğin, olarak bildirilen bir nesne std::çift<int, yüzer> iki üye içerecek, int ilk; ve yüzer ikinci;, artı üç yapıcı işlevi.

İlk (varsayılan) kurucu, her iki üyeyi de varsayılan değerlerle başlatır 0 ve 0.0ikincisi ise her türden bir parametre kabul eder. Üçüncüsü, herhangi bir std::çift<_U1, _U2>, türleri sağladı _U1 ve _U2 Yeteneğine sahiptir örtük dönüştürme -e int ve yüzer sırasıyla.

GCC'nin uygulaması, çift mekanizma aşağıdaki gibidir.[2]

şablon<sınıf _T1, sınıf _T2> yapı çift {	typedef _T1 ilk_tür;	typedef _T2 ikinci_tür;	_T1 ilk;	_T2 ikinci;	çift(): ilk(), ikinci() { }	çift(sabit _T1& __a, sabit _T2& __b): ilk(__a), ikinci(__b) { }	şablon<sınıf _U1, sınıf _U2> çift(sabit çift<_U1, _U2>& __p) : ilk(__p.ilk), ikinci(__p.ikinci) { }	};

Ek olarak bu başlık, altı ilişkisel operatörü de tanımlar. çift her iki türün ortak olduğu örnekler. Bunlar, türdeki nesneler için katı bir zayıf sıralama tanımlar std::çift<_T1, _T2>, göre ilk elemanlar ve sonra ikinci öğeler yalnızca ilk eşittir.

// yukarıdan devamşablon<sınıf _T1, sınıf _T2> Çizgide bool Şebeke ==(sabit çift<_T1, _T2>& __x, sabit çift<_T1, _T2>& __y)	{ dönüş __x.ilk == __y.ilk && __x.ikinci == __y.ikinci; }şablon<sınıf _T1, sınıf _T2> Çizgide bool Şebeke  <(sabit çift<_T1, _T2>& __x, sabit çift<_T1, _T2>& __y)	{ dönüş __x.ilk < __y.ilk || (!(__y.ilk < __x.ilk) && __x.ikinci < __y.ikinci); }şablon<sınıf _T1, sınıf _T2> Çizgide bool Şebeke !=(sabit çift<_T1, _T2>& __x, sabit çift<_T1, _T2>& __y)	{ dönüş !(__x == __y); }şablon<sınıf _T1, sınıf _T2> Çizgide bool Şebeke >(sabit çift<_T1, _T2>& __x, sabit çift<_T1, _T2>& __y)	{ dönüş __y < __x; }şablon<sınıf _T1, sınıf _T2> Çizgide bool Şebeke<=(sabit çift<_T1, _T2>& __x, sabit çift<_T1, _T2>& __y)	{ dönüş !(__y < __x); }şablon<sınıf _T1, sınıf _T2> Çizgide bool Şebeke>=(sabit çift<_T1, _T2>& __x, sabit çift<_T1, _T2>& __y)	{ dönüş !(__x < __y); }

Ek olarak başlık bir şablon işlevi içerir make_pair () dönüş türünü parametrelere göre çıkarır:

// yukarıdan devamşablon<sınıf _T1, sınıf _T2> Çizgide çift<_T1, _T2> make_pair(_T1 __x, _T2 __y)	{ dönüş çift<_T1, _T2>(__x, __y); }

Referanslar

  1. ^ Telif Hakkı (C) 2001, 2002, 2004, 2005, 2008 Free Software Foundation, Inc. altında mevcuttur GNU Genel Kamu Lisansı, sürüm 3 ve üzeri. Belgeler <https://gcc.gnu.org/onlinedocs/libstdc++/libstdc++-html-USERS-4.4/a00897.html >
  2. ^ İD., <https://gcc.gnu.org/onlinedocs/libstdc++/libstdc++-html-USERS-4.4/a00894.html >
  • ISO / IEC 14882: 2011 taslak şartname (PDF). s. 508, § 20.

Dış bağlantılar

Ayrıca bakınız