ΠΠΎΠ΄ΠΎΠ±Π½ΠΎ ΡΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠΌ ΡΠ»Π΅Π½Π°ΠΌ ΠΎΠ±ΡΡΠ½ΠΎΠ³ΠΎ ΠΊΠ»Π°ΡΡΠ°, ΠΊ ΡΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΎΠΌΡ ΡΠ»Π΅Π½Ρ ΡΠ°Π±Π»ΠΎΠ½Π° ΠΊΠ»Π°ΡΡΠ° ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ±ΡΠ°ΡΠΈΡΡΡΡ ΡΠ΅ΡΠ΅Π· ΠΎΠ±ΡΠ΅ΠΊΡ ΠΊΠ»Π°ΡΡΠ° ΠΈΠ»ΠΈ Π½Π΅ΠΏΠΎΡΡΠ΅Π΄ΡΡΠ²Π΅Π½Π½ΠΎ, ΠΏΡΠΈ ΠΏΠΎΠΌΠΎΡΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠ° ΠΎΠ±Π»Π°ΡΡΠΈ Π²ΠΈΠ΄ΠΈΠΌΠΎΡΡΠΈ. ΠΠΎΠ½Π΅ΡΠ½ΠΎ, ΡΡΠΎΠ±Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠΉ ΡΠ»Π΅Π½ ΡΠ΅ΡΠ΅Π· ΠΊΠ»Π°ΡΡ, ΡΠ»Π΅Π΄ΡΠ΅Ρ ΠΎΠ±ΡΠ°ΡΠΈΡΡΡΡ ΠΊ Π΅Π³ΠΎ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΠΎΠΌΡ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΡ:
Foo<int> fi; // ΡΠΎΠ·Π΄Π°Π΅Ρ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ ΠΊΠ»Π°ΡΡΠ° Foo<int>
// ΠΈ ΡΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΎΠΉ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ-ΡΠ»Π΅Π½Π° ctr
auto ct = Foo<int>::count(); // ΡΠΎΠ·Π΄Π°Π΅Ρ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ Foo<int>::count()
ct = fi.count(); // ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ Foo<int>::count()
ct = Foo::count(); // ΠΎΡΠΈΠ±ΠΊΠ°: ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ ΠΊΠ°ΠΊΠΎΠ³ΠΎ ΠΈΠΌΠ΅Π½Π½ΠΎ
// ΡΠ°Π±Π»ΠΎΠ½Π° ΡΠΎΠ·Π΄Π°Π΅ΡΡΡ?
ΠΠ°ΠΊ ΠΈ Π»ΡΠ±Π°Ρ Π΄ΡΡΠ³Π°Ρ ΡΡΠ½ΠΊΡΠΈΡ-ΡΠ»Π΅Π½, ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ ΡΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ-ΡΠ»Π΅Π½Π° ΡΠΎΠ·Π΄Π°Π΅ΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΠΏΡΠΈ Π΅Π³ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠΈ Π² ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ΅.
Π£ΠΏΡΠ°ΠΆΠ½Π΅Π½ΠΈΡ ΡΠ°Π·Π΄Π΅Π»Π° 16.1.2Π£ΠΏΡΠ°ΠΆΠ½Π΅Π½ΠΈΠ΅ 16.9. Π§ΡΠΎ ΡΠ°ΠΊΠΎΠ΅ ΡΠ°Π±Π»ΠΎΠ½ ΡΡΠ½ΠΊΡΠΈΠΈ? Π§ΡΠΎ ΡΠ°ΠΊΠΎΠ΅ ΡΠ°Π±Π»ΠΎΠ½ ΠΊΠ»Π°ΡΡΠ°?
Π£ΠΏΡΠ°ΠΆΠ½Π΅Π½ΠΈΠ΅ 16.10. Π§ΡΠΎ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ ΠΏΡΠΈ ΡΠΎΠ·Π΄Π°Π½ΠΈΠΈ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠ° ΡΠ°Π±Π»ΠΎΠ½Π° ΠΊΠ»Π°ΡΡΠ°?
Π£ΠΏΡΠ°ΠΆΠ½Π΅Π½ΠΈΠ΅ 16.11. Π‘Π»Π΅Π΄ΡΡΡΠ΅Π΅ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΡΠ°Π±Π»ΠΎΠ½Π° List Π½Π΅ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎ. ΠΠ°ΠΊ Π΅Π³ΠΎ ΠΈΡΠΏΡΠ°Π²ΠΈΡΡ?
template <typename elemType> class ListItem;
template <typename elemType> class List {
public:
List<elemType>();
List<elemType>(const List<elemType> &);
List<elemType>& operator=(const List<elemType> &);
~List();
void insert(ListItem *ptr, elemType value);
private:
ListItem *front, *end;
};
Π£ΠΏΡΠ°ΠΆΠ½Π΅Π½ΠΈΠ΅ 16.12. ΠΠ°ΠΏΠΈΡΠΈΡΠ΅ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΡΠ΅ Π²Π΅ΡΡΠΈΠΈ ΡΠ°Π±Π»ΠΎΠ½ΠΎΠ² Blob ΠΈ BlobPtr, Π²ΠΊΠ»ΡΡΠ°Ρ Π²ΡΠ΅ ΠΊΠΎΠ½ΡΡΠ°Π½ΡΠ½ΡΠ΅ ΡΠ»Π΅Π½Ρ, ΠΊΠΎΡΠΎΡΡΠ΅ Π½Π΅ Π±ΡΠ»ΠΈ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½Ρ Π² ΡΠ΅ΠΊΡΡΠ΅.
Π£ΠΏΡΠ°ΠΆΠ½Π΅Π½ΠΈΠ΅ 16.13. ΠΠ±ΡΡΡΠ½ΠΈΡΠ΅, ΠΊΠ°ΠΊΠΎΠΉ Π²ΠΈΠ΄ Π΄ΡΡΠΆΠ΅ΡΡΠ²Π΅Π½Π½ΡΡ ΠΎΡΠ½ΠΎΡΠ΅Π½ΠΈΠΉ Π²Ρ Π²ΡΠ±ΡΠ°Π»ΠΈ Π±Ρ Π΄Π»Ρ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠΎΠ² ΡΠ°Π²Π΅Π½ΡΡΠ²Π° ΠΈ ΡΡΠ°Π²Π½Π΅Π½ΠΈΡ ΡΠ°Π±Π»ΠΎΠ½Π° BlobPtr.
Π£ΠΏΡΠ°ΠΆΠ½Π΅Π½ΠΈΠ΅ 16.14. ΠΠ°ΠΏΠΈΡΠΈΡΠ΅ ΡΠ°Π±Π»ΠΎΠ½ ΠΊΠ»Π°ΡΡΠ° Screen, ΠΊΠΎΡΠΎΡΡΠΉ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΡ Π΄Π»Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ Π²ΡΡΠΎΡΡ ΠΈ ΡΠΈΡΠΈΠ½Ρ ΡΠΊΡΠ°Π½Π°.
Π£ΠΏΡΠ°ΠΆΠ½Π΅Π½ΠΈΠ΅ 16.15. Π Π΅Π°Π»ΠΈΠ·ΡΠΉΡΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΡ Π²Π²ΠΎΠ΄Π° ΠΈ Π²ΡΠ²ΠΎΠ΄Π° Π΄Π»Ρ ΡΠ²ΠΎΠ΅Π³ΠΎ ΡΠ°Π±Π»ΠΎΠ½Π° Screen. ΠΠ°ΠΊΠΈΠ΅ Π΄ΡΡΠ·ΡΡ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΡ ΠΊΠ»Π°ΡΡΡ Screen (Π΅ΡΠ»ΠΈ ΡΠ°ΠΊΠΎΠ²ΡΠ΅ Π²ΠΎΠΎΠ±ΡΠ΅ ΠΈΠΌΠ΅ΡΡΡΡ) Π΄Π»Ρ ΡΠ°Π±ΠΎΡΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠΎΠ² Π²Π²ΠΎΠ΄Π° ΠΈ Π²ΡΠ²ΠΎΠ΄Π°? ΠΠ±ΡΡΡΠ½ΠΈΡΠ΅, Π·Π°ΡΠ΅ΠΌ Π½ΡΠΆΠ½ΠΎ ΠΊΠ°ΠΆΠ΄ΠΎΠ΅ ΠΎΠ±ΡΡΠ²Π»Π΅Π½ΠΈΠ΅ Π΄ΡΡΠΆΠ΅ΡΡΠ²Π΅Π½Π½ΡΠΌ (Π΅ΡΠ»ΠΈ ΡΠ°ΠΊΠΎΠ²ΡΠ΅ Π²ΠΎΠΎΠ±ΡΠ΅ ΠΈΠΌΠ΅ΡΡΡΡ).
Π£ΠΏΡΠ°ΠΆΠ½Π΅Π½ΠΈΠ΅ 16.16. ΠΠ΅ΡΠ΅ΠΏΠΈΡΠΈΡΠ΅ ΠΊΠ»Π°ΡΡ StrVec (ΡΠΌ. ΡΠ°Π·Π΄Π΅Π» 13.5), ΠΊΠ°ΠΊ ΡΠ°Π±Π»ΠΎΠ½ Vec.
16.1.3. ΠΠ°ΡΠ°ΠΌΠ΅ΡΡΡ ΡΠ°Π±Π»ΠΎΠ½Π°
ΠΠΎΠ΄ΠΎΠ±Π½ΠΎ ΠΈΠΌΠ΅Π½Π°ΠΌ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠ² ΡΡΠ½ΠΊΡΠΈΠΉ, ΠΈΠΌΠ΅Π½Π° ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠ² ΡΠ°Π±Π»ΠΎΠ½Π° Π½Π΅ ΠΈΠΌΠ΅ΡΡ Π½ΠΈΠΊΠ°ΠΊΠΎΠ³ΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΡ. ΠΠ±ΡΡΠ½ΠΎ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ°ΠΌ ΡΠΈΠΏΠ° ΠΏΡΠΈΡΠ²Π°ΠΈΠ²Π°ΡΡ ΠΈΠΌΡ Π’, Π½ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π»ΡΠ±ΠΎΠ΅ Π΄ΡΡΠ³ΠΎΠ΅:
template <typename Foo> Foo calc(const Foo& a, const Foo& b) {
Foo tmp = a; // ΡΠΈΠΏ tmp ΡΠΎΠ²ΠΏΠ°Π΄Π°Π΅Ρ Ρ ΡΠΈΠΏΠΎΠΌ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠ² ΠΈ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌΠΎΠ³ΠΎ
// Π·Π½Π°ΡΠ΅Π½ΠΈΡ
// ...
return tmp; // ΡΠΈΠΏΡ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌΠΎΠ³ΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΠΈ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠ² ΡΠΎΠ²ΠΏΠ°Π΄Π°ΡΡ
}
ΠΠ°ΡΠ°ΠΌΠ΅ΡΡΡ ΡΠ°Π±Π»ΠΎΠ½Π° ΠΈ ΠΎΠ±Π»Π°ΡΡΡ Π²ΠΈΠ΄ΠΈΠΌΠΎΡΡΠΈΠΠ°ΡΠ°ΠΌΠ΅ΡΡΡ ΡΠ°Π±Π»ΠΎΠ½Π° ΡΠ»Π΅Π΄ΡΡΡ ΠΎΠ±ΡΡΠ½ΡΠΌ ΠΏΡΠ°Π²ΠΈΠ»Π°ΠΌ ΠΎΠ±Π»Π°ΡΡΠΈ Π²ΠΈΠ΄ΠΈΠΌΠΎΡΡΠΈ. ΠΠΌΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ° ΡΠ°Π±Π»ΠΎΠ½Π° ΠΏΡΠΈΠΌΠ΅Π½ΠΈΠΌΠΎ ΡΡΠ°Π·Ρ ΠΏΠΎΡΠ»Π΅ Π΅Π³ΠΎ ΠΎΠ±ΡΡΠ²Π»Π΅Π½ΠΈΡ ΠΈ Π΄ΠΎ ΠΊΠΎΠ½ΡΠ° ΠΎΠ±ΡΡΠ²Π»Π΅Π½ΠΈΡ ΠΈΠ»ΠΈ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ ΡΠ°Π±Π»ΠΎΠ½Π°. ΠΠΎΠ΄ΠΎΠ±Π½ΠΎ Π»ΡΠ±ΡΠΌ Π΄ΡΡΠ³ΠΈΠΌ ΠΈΠΌΠ΅Π½Π°ΠΌ, ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ ΡΠ°Π±Π»ΠΎΠ½Π° ΡΠΊΡΡΠ²Π°Π΅Ρ Π»ΡΠ±ΡΠ΅ ΠΎΠ±ΡΡΠ²Π»Π΅Π½ΠΈΡ ΠΈΠΌΠ΅Π½ Π²ΠΎ Π²Π½Π΅ΡΠ½Π΅ΠΉ ΠΎΠ±Π»Π°ΡΡΠΈ Π²ΠΈΠ΄ΠΈΠΌΠΎΡΡΠΈ. ΠΠ΄Π½Π°ΠΊΠΎ, Π² ΠΎΡΠ»ΠΈΡΠΈΠ΅ ΠΎΡ Π±ΠΎΠ»ΡΡΠΈΠ½ΡΡΠ²Π° Π΄ΡΡΠ³ΠΈΡ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠΎΠ², ΠΈΠΌΡ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΠΎΠ΅ ΠΊΠ°ΠΊ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ ΡΠ°Π±Π»ΠΎΠ½Π°, Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΏΠΎΠ²ΡΠΎΡΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΎ Π² ΠΏΡΠ΅Π΄Π΅Π»Π°Ρ ΡΠ°Π±Π»ΠΎΠ½Π°:
typedef double Π;
template <typename A, typename Π> void f(Π Π°, Π b) {
A tmp = Π°; // tmp ΠΈΠΌΠ΅Π΅Ρ ΡΠΈΠΏ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ° ΡΠ°Π±Π»ΠΎΠ½Π° Π, Π° Π½Π΅ double
double Π; // ΠΎΡΠΈΠ±ΠΊΠ°: ΠΏΠΎΠ²ΡΠΎΡΠ½ΠΎΠ΅ ΠΎΠ±ΡΡΠ²Π»Π΅Π½ΠΈΠ΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ° ΡΠ°Π±Π»ΠΎΠ½Π° Π
}
Π‘ΠΎΠ³Π»Π°ΡΠ½ΠΎ ΠΎΠ±ΡΡΠ½ΡΠΌ ΠΏΡΠ°Π²ΠΈΠ»Π°ΠΌ ΡΠΎΠΊΡΡΡΠΈΡ ΠΈΠΌΠ΅Π½, ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ typedef ΡΠΈΠΏΠ° Π ΡΠΊΡΡΠ²Π°Π΅ΡΡΡ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ΠΌ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ° ΡΠΈΠΏΠ° ΠΏΠΎ ΠΈΠΌΠ΅Π½ΠΈ Π. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ, ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ tmp Π½Π΅ Π±ΡΠ΄Π΅Ρ ΠΈΠΌΠ΅ΡΡ ΡΠΈΠΏ double; ΠΎΠ½Π° Π±ΡΠ΄Π΅Ρ ΠΈΠΌΠ΅ΡΡ Π»ΡΠ±ΠΎΠΉ ΡΠΈΠΏ, ΠΊΠΎΡΠΎΡΡΠΉ Π±ΡΠ΄Π΅Ρ ΠΏΠ΅ΡΠ΅Π΄Π°Π½ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ ΡΠ°Π±Π»ΠΎΠ½Π° Π ΠΏΡΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠΈ ΡΠ°Π±Π»ΠΎΠ½Π°. ΠΠΎΡΠΊΠΎΠ»ΡΠΊΡ Π½Π΅Π»ΡΠ·Ρ ΠΌΠ½ΠΎΠ³ΠΎΠΊΡΠ°ΡΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΈΠΌΠ΅Π½Π° ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠ² ΡΠ°Π±Π»ΠΎΠ½Π°, ΠΎΠ±ΡΡΠ²Π»Π΅Π½ΠΈΠ΅ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΏΠΎ ΠΈΠΌΠ΅Π½ΠΈ B ΠΎΡΠΈΠ±ΠΎΡΠ½ΠΎ.
ΠΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΈΠΌΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ° Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΎ ΠΌΠ½ΠΎΠ³ΠΎΠΊΡΠ°ΡΠ½ΠΎ, Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΡΠΏΠΈΡΠΊΠ΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠ² ΡΠ°Π±Π»ΠΎΠ½Π° ΠΈΠΌΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ° ΡΠ°Π±Π»ΠΎΠ½Π° ΠΌΠΎΠΆΠ΅Ρ ΠΏΡΠΈΡΡΡΡΡΠ²ΠΎΠ²Π°ΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠ΄Π½Π°ΠΆΠ΄Ρ:
// ΠΎΡΠΈΠ±ΠΊΠ°: ΠΏΠΎΠ²ΡΠΎΡΠ΅Π½ΠΈΠ΅ ΠΈΠΌΠ΅Π½ΠΈ V Π² ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ°Ρ ΡΠ°Π±Π»ΠΎΠ½Π° Π½Π΅Π΄ΠΎΠΏΡΡΡΠΈΠΌΠΎ
template <typename V, typename V> // ...
ΠΠ±ΡΡΠ²Π»Π΅Π½ΠΈΡ ΡΠ°Π±Π»ΠΎΠ½Π°ΠΠ±ΡΡΠ²Π»Π΅Π½ΠΈΠ΅ ΡΠ°Π±Π»ΠΎΠ½Π° Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π²ΠΊΠ»ΡΡΠΈΡΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ ΡΠ°Π±Π»ΠΎΠ½Π°:
// ΠΎΠ±ΡΡΠ²Π»ΡΠ΅Ρ, Π½ΠΎ Π½Π΅ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅Ρ compare ΠΈ Blob
template <typename Π’> int compare(const T&, const T&);
template <typename T> class Blob;
ΠΠΎΠ΄ΠΎΠ±Π½ΠΎ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ°ΠΌ ΡΡΠ½ΠΊΡΠΈΠΉ, ΠΈΠΌΠ΅Π½Π° ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠ² ΡΠ°Π±Π»ΠΎΠ½Π° Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ ΡΠΎΠ²ΠΏΠ°Π΄Π°ΡΡ Ρ ΡΠ°ΠΊΠΎΠ²ΡΠΌΠΈ Π² ΠΎΠ±ΡΡΠ²Π»Π΅Π½ΠΈΡΡ ΠΈ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡΡ ΡΠΎΠ³ΠΎ ΠΆΠ΅ ΡΠ°Π±Π»ΠΎΠ½Π°:
// Π²ΡΠ΅ ΡΡΠΈ ΡΠ»ΡΡΠ°Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ calc
// ΠΎΡΠ½ΠΎΡΡΡΡΡ ΠΊ ΡΠΎΠΌΡ ΠΆΠ΅ ΡΠ°Π±Π»ΠΎΠ½Ρ ΡΡΠ½ΠΊΡΠΈΠΈ
template <typename Π’> Π’ calc(const Π’&, const Π’&); // ΠΎΠ±ΡΡΠ²Π»Π΅Π½ΠΈΠ΅
template <typename U> U calc(const U&, const U&); // ΠΎΠ±ΡΡΠ²Π»Π΅Π½ΠΈΠ΅
// ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΡΠ°Π±Π»ΠΎΠ½Π°
template <typename Type>
Type calc(const Type& a, const Type& b) { /* ... */ }
ΠΠΎΠ½Π΅ΡΠ½ΠΎ, Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΎΠ±ΡΡΠ²Π»Π΅Π½ΠΈΡ ΠΈ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ ΡΠ°Π±Π»ΠΎΠ½Π° Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±ΡΡΡ ΡΠΎ ΠΆΠ΅ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΠΈ Π²ΠΈΠ΄ (Ρ.Π΅. ΡΠΈΠΏ ΠΈΠ»ΠΈ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅) ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠ².
ΠΠΎ ΠΏΡΠΈΡΠΈΠ½Π°ΠΌ, ΡΠ°ΡΡΠΌΠ°ΡΡΠΈΠ²Π°Π΅ΠΌΡΠΌ Π² ΡΠ°Π·Π΄Π΅Π»Π΅ 16.3, ΠΎΠ±ΡΡΠ²Π»Π΅Π½ΠΈΡ Π²ΡΠ΅Ρ ΡΠ°Π±Π»ΠΎΠ½ΠΎΠ², Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΡΡ Π΄Π°Π½Π½ΠΎΠΌΡ ΡΠ°ΠΉΠ»Ρ, ΠΎΠ±ΡΡΠ½ΠΎ ΡΠ°ΡΠΏΠΎΠ»Π°Π³Π°ΡΡΡΡ Π²ΠΌΠ΅ΡΡΠ΅ Π² Π½Π°ΡΠ°Π»Π΅ ΡΠ°ΠΉΠ»Π° ΠΏΠ΅ΡΠ΅Π΄ Π»ΡΠ±ΡΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΠΈΠΌ ΠΈΡ ΠΊΠΎΠ΄ΠΎΠΌ.
ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΡΠ»Π΅Π½ΠΎΠ² ΡΠΈΠΏΠ°ΠΠΎΠΌΠ½ΠΈΡΠ΅, ΠΊΠ°ΠΊ Π² ΡΠ°Π·Π΄Π΅Π»Π°Ρ 7.4 ΠΈ 7.6 ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π»ΡΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡ ΠΎΠ±Π»Π°ΡΡΠΈ Π²ΠΈΠ΄ΠΈΠΌΠΎΡΡΠΈ (::) Π΄Π»Ρ ΠΎΠ±ΡΠ°ΡΠ΅Π½ΠΈΡ ΠΊ ΡΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠΌ ΡΠ»Π΅Π½Π°ΠΌ ΠΈ ΡΠ»Π΅Π½Π°ΠΌ ΡΠΈΠΏΠ°. Π ΠΎΠ±ΡΡΠ½ΠΎΠΌ ΠΊΠΎΠ΄Π΅ (Π½Π΅ ΡΠ°Π±Π»ΠΎΠ½Π°) Ρ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡΠ° Π΅ΡΡΡ Π΄ΠΎΡΡΡΠΏ ΠΊ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ ΠΊΠ»Π°ΡΡΠ°. Π ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ΅ ΠΎΠ½ Π·Π½Π°Π΅Ρ, ΡΠ²Π»ΡΠ΅ΡΡΡ Π»ΠΈ ΠΈΠΌΡ, ΠΊ ΠΊΠΎΡΠΎΡΠΎΠΌΡ ΠΎΠ±ΡΠ°ΡΠ°ΡΡΡΡ ΡΠ΅ΡΠ΅Π· ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡ ΠΎΠ±Π»Π°ΡΡΠΈ Π²ΠΈΠ΄ΠΈΠΌΠΎΡΡΠΈ, ΡΠΈΠΏΠΎΠΌ ΠΈΠ»ΠΈ ΡΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠΌ ΡΠ»Π΅Π½ΠΎΠΌ. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, Π² ΠΊΠΎΠ΄Π΅ string::size_type, ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡ ΠΈΠΌΠ΅Π΅Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΊΠ»Π°ΡΡΠ° string ΠΈ ΠΌΠΎΠΆΠ΅Ρ ΡΠ·Π½Π°ΡΡ, ΡΡΠΎ size_type β ΡΡΠΎ ΡΠΈΠΏ.
Π‘ ΡΡΠ΅ΡΠΎΠΌ ΡΠΎΠ³ΠΎ, ΡΡΠΎ Π’ ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠΌ ΡΠΈΠΏΠ° ΡΠ°Π±Π»ΠΎΠ½Π°, ΠΊΠΎΠ³Π΄Π° ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡ Π²ΡΡΡΠ΅ΡΠΈΡ ΡΠ°ΠΊΠΎΠΉ ΠΊΠΎΠ΄, ΠΊΠ°ΠΊ T::mem, ΠΎΠ½ Π½Π΅ Π±ΡΠ΄Π΅Ρ Π·Π½Π°ΡΡ Π΄ΠΎ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠ°, ΡΠ²Π»ΡΠ΅ΡΡΡ Π»ΠΈ mem ΡΠΈΠΏΠΎΠΌ ΠΈΠ»ΠΈ ΡΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΎΠΉ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ-ΡΠ»Π΅Π½ΠΎΠΌ. ΠΠΎ ΡΡΠΎΠ±Ρ ΠΎΠ±ΡΠ°Π±ΠΎΡΠ°ΡΡ ΡΠ°Π±Π»ΠΎΠ½, ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π·Π½Π°ΡΡ, ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΠ΅Ρ Π»ΠΈ ΠΈΠΌΡ ΡΠΈΠΏ. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, Π΅ΡΠ»ΠΈ T ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΈΠΌΠ΅Π½Π΅ΠΌ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ° ΡΠΈΠΏΠ°, ΡΠΎ ΠΊΠ°ΠΊ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡ Π²ΠΎΡΠΏΡΠΈΠΌΠ΅Ρ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΉ ΠΊΠΎΠ΄:
T::size_type * p;
ΠΠ½ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π·Π½Π°ΡΡ, ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅ΡΡΡ Π»ΠΈ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ ΠΏΠΎ ΠΈΠΌΠ΅Π½ΠΈ p ΠΈΠ»ΠΈ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ ΡΠΌΠ½ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΡΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΎΠΉ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ-ΡΠ»Π΅Π½Π° ΠΏΠΎ ΠΈΠΌΠ΅Π½ΠΈ size_type Π½Π° ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ ΠΏΠΎ ΠΈΠΌΠ΅Π½ΠΈ p.
ΠΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ ΡΠ·ΡΠΊ ΠΏΠΎΠ΄ΡΠ°Π·ΡΠΌΠ΅Π²Π°Π΅Ρ, ΡΡΠΎ ΠΈΠΌΡ, ΠΊ ΠΊΠΎΡΠΎΡΠΎΠΌΡ ΠΎΠ±ΡΠ°ΡΠ°ΡΡΡΡ ΡΠ΅ΡΠ΅Π· ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡ ΠΎΠ±Π»Π°ΡΡΠΈ Π²ΠΈΠ΄ΠΈΠΌΠΎΡΡΠΈ, Π½Π΅ ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΠΈΠΏΠΎΠΌ. Π ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ΅, Π΅ΡΠ»ΠΈ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΠΈΠΏ-ΡΠ»Π΅Π½ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ° ΡΠΈΠΏΠ° ΡΠ°Π±Π»ΠΎΠ½Π°, ΡΠ»Π΅Π΄ΡΠ΅Ρ ΡΠ²Π½ΠΎ ΡΠΊΠ°Π·Π°ΡΡ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡΡ, ΡΡΠΎ ΠΈΠΌΡ ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΠΈΠΏΠΎΠΌ. ΠΠ»Ρ ΡΡΠΎΠ³ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΠΊΠ»ΡΡΠ΅Π²ΠΎΠ΅ ΡΠ»ΠΎΠ²ΠΎ typename:
template <typename Π’>
typename Π’::value_type top(const T& Ρ) {
if (!c.empty())
return c.back();
else
return typename T::value_type();
}
Π€ΡΠ½ΠΊΡΠΈΡ top() ΠΎΠΆΠΈΠ΄Π°Π΅Ρ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠ°, ΠΎΠ½Π° ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ ΠΊΠ»ΡΡΠ΅Π²ΠΎΠ΅ ΡΠ»ΠΎΠ²ΠΎ typename Π΄Π»Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ ΡΠ²ΠΎΠ΅Π³ΠΎ ΡΠΈΠΏΠ° Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌΠΎΠ³ΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΠΈ ΡΠΎΠ·Π΄Π°Π΅Ρ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΡΠΉ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ ΡΠ»Π΅ΠΌΠ΅Π½Ρ (ΡΠΌ. ΡΠ°Π·Π΄Π΅Π» 7.5.3), ΡΡΠΎΠ±Ρ Π²ΠΎΠ·Π²ΡΠ°ΡΠΈΡΡ Π΅Π³ΠΎ, Π΅ΡΠ»ΠΈ Ρ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ° Ρ Π½Π΅Ρ Π½ΠΈΠΊΠ°ΠΊΠΈΡ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ².
ΠΠΎΠ³Π΄Π° Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΡΠ²Π΅Π΄ΠΎΠΌΠΈΡΡ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡ ΠΎ ΡΠΎΠΌ, ΡΡΠΎ ΠΈΠΌΡ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΠ΅Ρ ΡΠΈΠΏ, ΡΠ»Π΅Π΄ΡΠ΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΊΠ»ΡΡΠ΅Π²ΠΎΠ΅ ΡΠ»ΠΎΠ²ΠΎ typename, Π° Π½Π΅ class.
ΠΡΠ³ΡΠΌΠ΅Π½ΡΡ ΡΠ°Π±Π»ΠΎΠ½Π° ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡΠΠ½Π°Π»ΠΎΠ³ΠΈΡΠ½ΠΎ ΡΠΎΠΌΡ, ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²ΠΈΡΡ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΡ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ Π΄Π»Ρ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠ² ΡΡΠ½ΠΊΡΠΈΠΈ (ΡΠΌ. ΡΠ°Π·Π΄Π΅Π» 6.5.1), ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²ΠΈΡΡ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΡ ΡΠ°Π±Π»ΠΎΠ½Π° ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ (default template argument). ΠΠΎ Π½ΠΎΠ²ΠΎΠΌΡ ΡΡΠ°Π½Π΄Π°ΡΡΡ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΡΡ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΡ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ ΠΈ Π΄Π»Ρ ΡΠ°Π±Π»ΠΎΠ½ΠΎΠ² ΡΡΠ½ΠΊΡΠΈΠΉ, ΠΈ Π΄Π»Ρ ΡΠ°Π±Π»ΠΎΠ½ΠΎΠ² ΠΊΠ»Π°ΡΡΠΎΠ². ΠΡΠ΅ΠΆΠ½ΠΈΠ΅ Π²Π΅ΡΡΠΈΠΈ ΡΠ·ΡΠΊΠ° Π΄ΠΎΠΏΡΡΠΊΠ°Π»ΠΈ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΡ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ ΡΠΎΠ»ΡΠΊΠΎ Π΄Π»Ρ ΡΠ°Π±Π»ΠΎΠ½ΠΎΠ² ΠΊΠ»Π°ΡΡΠ°.
Π ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΠΏΡΠΈΠΌΠ΅ΡΠ° ΠΏΠ΅ΡΠ΅ΠΏΠΈΡΠ΅ΠΌ ΡΡΠ½ΠΊΡΠΈΡ ΡΡΠ°Π²Π½Π΅Π½ΠΈΡ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΡΡ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΡΠ½ΡΠΉ ΡΠ°Π±Π»ΠΎΠ½Π½ΡΠΉ ΠΎΠ±ΡΠ΅ΠΊΡ ΡΡΠ½ΠΊΡΠΈΠΈ less (ΡΠΌ. ΡΠ°Π·Π΄Π΅Π» 14.8.2):
// compare() ΠΈΠΌΠ΅Π΅Ρ Π°ΡΠ³ΡΠΌΠ΅Π½Ρ ΡΠ°Π±Π»ΠΎΠ½Π° ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ, less<T>
// ΠΈ Π·Π°Π΄Π°Π½Π½ΡΠΉ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ Π°ΡΠ³ΡΠΌΠ΅Π½Ρ ΡΡΠ½ΠΊΡΠΈΠΈ, F()
template <typename Π’, typename F = less<T>>
int compare(const T &v1, const T &v2, F f = F()) {
if (f(v1, v2)) return -1;
if (f(v2, v1)) return 1;
return 0;
}
ΠΠ΄Π΅ΡΡ Π² ΡΠ°Π±Π»ΠΎΠ½ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ Π²ΡΠΎΡΠΎΠΉ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ ΡΠΈΠΏΠ°, F, ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΡΡΠΈΠΉ ΡΠΈΠΏ Π²ΡΠ·ΡΠ²Π°Π΅ΠΌΠΎΠ³ΠΎ ΠΎΠ±ΡΠ΅ΠΊΡΠ° (ΡΠΌ. ΡΠ°Π·Π΄Π΅Π» 10.3.2), ΠΈ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ Π½ΠΎΠ²ΡΠΉ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ, f, ΠΊΠΎΡΠΎΡΡΠΉ Π±ΡΠ΄Π΅Ρ ΡΠ²ΡΠ·Π°Π½ Ρ Π²ΡΠ·ΡΠ²Π°Π΅ΠΌΡΠΌ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠΌ.