Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Π­Ρ„Ρ„Π΅ΠΊΡ‚ΠΈΠ²Π½ΠΎΠ΅ использованиС C++. 55 Π²Π΅Ρ€Π½Ρ‹Ρ… способов ΡƒΠ»ΡƒΡ‡ΡˆΠΈΡ‚ΡŒ структуру ΠΈ ΠΊΠΎΠ΄ Π²Π°ΡˆΠΈΡ… ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΒ». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 54

Автор Π‘ΠΊΠΎΡ‚Ρ‚ ΠœΠ°ΠΉΠ΅Ρ€Ρ

(ΠšΡΡ‚Π°Ρ‚ΠΈ говоря: ΠΌΡ‹ Π½Π΅ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅ΠΌ Π²ΠΎ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠ·ΠΊΠΈ operator&&, Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ сСмантика ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠ³ΠΎ выраТСния ΠΌΠΎΠΆΠ΅Ρ‚ ΡΡ‚Π°Ρ‚ΡŒ ΡƒΠΆΠ΅ Π½Π΅ ΠΊΠΎΠ½ΡŠΡŽΠ½ΠΊΡ†ΠΈΠ΅ΠΉ, Π° Ρ‡Π΅ΠΌ-Ρ‚ΠΎ ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½Π½ΠΎ ΠΈΠ½Ρ‹ΠΌ.)

Π£ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π° людСй Π³ΠΎΠ»ΠΎΠ²Π° ΠΈΠ΄Π΅Ρ‚ ΠΊΡ€ΡƒΠ³ΠΎΠΌ, ΠΊΠΎΠ³Π΄Π° ΠΎΠ½ΠΈ Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‚ Π·Π°Π΄ΡƒΠΌΡ‹Π²Π°Ρ‚ΡŒΡΡ ΠΎ нСявных интСрфСйсах, Π½ΠΎ Π½Π° самом Π΄Π΅Π»Π΅ Π½ΠΈΡ‡Π΅Π³ΠΎ ΡΡ‚Ρ€Π°ΡˆΠ½ΠΎΠ³ΠΎ Π² Π½ΠΈΡ… Π½Π΅Ρ‚. НСявныС интСрфСйсы – это просто Π½Π°Π±ΠΎΡ€ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½Ρ‹Ρ… Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ. Π‘Π°ΠΌΠΈ ΠΏΠΎ сСбС выраТСния ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ слоТными, Π½ΠΎ Π½Π°Π»Π°Π³Π°Π΅ΠΌΡ‹Π΅ ΠΈΠΌΠΈ ограничСния достаточно ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½Ρ‹.


if(w.size() > 10 && w != someNastyWidget)...


Мало Ρ‡Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΊΠ°Π·Π°Ρ‚ΡŒ ΠΎΠ± ограничСниях, Π½Π°Π»Π°Π³Π°Π΅ΠΌΡ‹Ρ… функциями size, operator>, operator&& ΠΈΠ»ΠΈ operator!=, Π½ΠΎ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ограничСния всСго выраТСния Π² Ρ†Π΅Π»ΠΎΠΌ Π»Π΅Π³ΠΊΠΎ. Условная Ρ‡Π°ΡΡ‚ΡŒ прСдлоТСния if Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ булСвским Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ΠΌ, поэтому нСзависимо ΠΎΡ‚ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ вычислСния (w.size() > 10 && w!= someNastyWidget) Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ совмСстим с bool. Π­Ρ‚ΠΎ Ρ‚Π° Ρ‡Π°ΡΡ‚ΡŒ нСявного интСрфСйса, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ шаблон doProcessing Π½Π°Π»Π°Π³Π°Π΅Ρ‚ Π½Π° свой ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ Ρ‚ΠΈΠΏΠ° T. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, для Ρ€Π°Π±ΠΎΡ‚Ρ‹ doProcessing Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ интСрфСйс Ρ‚ΠΈΠΏΠ° T допускал обращСния ΠΊ конструктору копирования, Π° Ρ‚Π°ΠΊΠΆΠ΅ функциям normalize, size ΠΈ swap.

ΠžΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΡ, Π½Π°Π»Π°Π³Π°Π΅ΠΌΡ‹Π΅ нСявными интСрфСйсами Π½Π° ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ шаблона, Ρ‚Π°ΠΊ ΠΆΠ΅ Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹, ΠΊΠ°ΠΊ ограничСния, Π½Π°Π»Π°Π³Π°Π΅ΠΌΡ‹Π΅ явными интСрфСйсами Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ класса: ΠΈ Ρ‚Π΅, ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡŽΡ‚ΡΡ Π½Π° этапС компиляции. Π’Ρ‹ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ способами, ΠΏΡ€ΠΎΡ‚ΠΈΠ²ΠΎΡ€Π΅Ρ‡Π°Ρ‰ΠΈΠΌΠΈ явным интСрфСйсам ΠΈΡ… классов (Ρ‚Π°ΠΊΠΎΠΉ ΠΊΠΎΠ΄ Π½Π΅ скомпилируСтся), ΠΈ Ρ‚ΠΎΡ‡Π½ΠΎ Ρ‚Π°ΠΊ ΠΆΠ΅ Π²Ρ‹ Π½Π΅ ΠΏΡ‹Ρ‚Π°ΠΉΡ‚Π΅ΡΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π² шаблонС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‰ΠΈΠΉ нСявный интСрфСйс, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ шаблон (ΠΎΠΏΡΡ‚ΡŒ ΠΆΠ΅, ΠΊΠΎΠ΄ Π½Π΅ скомпилируСтся).

Π§Ρ‚ΠΎ слСдуСт ΠΏΠΎΠΌΠ½ΠΈΡ‚ΡŒ

β€’ И классы, ΠΈ ΡˆΠ°Π±Π»ΠΎΠ½Ρ‹ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ интСрфСйсы ΠΈ ΠΏΠΎΠ»ΠΈΠΌΠΎΡ€Ρ„ΠΈΠ·ΠΌ.

β€’ Для классов интСрфСйсы ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Ρ‹ явно ΠΈ Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‚ Π³Π»Π°Π²Π½Ρ‹ΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ сигнатуры Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ. ΠŸΠΎΠ»ΠΈΠΌΠΎΡ€Ρ„ΠΈΠ·ΠΌ проявляСтся Π²ΠΎ врСмя исполнСния – Ρ‡Π΅Ρ€Π΅Π· Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.

β€’ Для ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² шаблонов интСрфСйсы нСявны ΠΈ основаны Π½Π° ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½Ρ‹Ρ… выраТСниях. ΠŸΠΎΠ»ΠΈΠΌΠΎΡ€Ρ„ΠΈΠ·ΠΌ проявляСтся Π²ΠΎ врСмя компиляции – Ρ‡Π΅Ρ€Π΅Π· ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚ΠΈΠ·Π°Ρ†ΠΈΡŽ ΠΈ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠ·ΠΊΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ.

ΠŸΡ€Π°Π²ΠΈΠ»ΠΎ 42: УсвойтС ΠΎΠ±Π° значСния ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ³ΠΎ слова typename

Вопрос: какая Ρ€Π°Π·Π½ΠΈΡ†Π° ΠΌΠ΅ΠΆΠ΄Ρƒ Β«classΒ» ΠΈ Β«typenameΒ» Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ объявлСнии шаблона:


template <class T> class Widget; // ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ β€œclass”

template <typename T> class Widget; // ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ β€œtypename”


ΠžΡ‚Π²Π΅Ρ‚: Π½ΠΈΠΊΠ°ΠΊΠΎΠΉ. Когда Π² шаблонС ΠΎΠ±ΡŠΡΠ²Π»ΡΠ΅Ρ‚ΡΡ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ Ρ‚ΠΈΠΏΠ°, class ΠΈ type-name ΠΎΠ·Π½Π°Ρ‡Π°ΡŽΡ‚ Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½ΠΎ ΠΎΠ΄Π½ΠΎ ΠΈ Ρ‚ΠΎ ΠΆΠ΅. НСкоторыС программисты ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡ΠΈΡ‚Π°ΡŽΡ‚ всСгда ΠΏΠΈΡΠ°Ρ‚ΡŒ class, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ это слово ΠΊΠΎΡ€ΠΎΡ‡Π΅. Π”Ρ€ΡƒΠ³ΠΈΠ΅ (Π²ΠΊΠ»ΡŽΡ‡Π°Ρ мСня) ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡ΠΈΡ‚Π°ΡŽΡ‚ typename, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ½ΠΎ Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ Π½Π΅ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ Ρ‚ΠΈΠΏ класса. НСкоторыС Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ typename, ΠΊΠΎΠ³Π΄Π° допускаСтся любой Ρ‚ΠΈΠΏ, ΠΈ Ρ€Π΅Π·Π΅Ρ€Π²ΠΈΡ€ΡƒΡŽΡ‚ слово class для случаСв, ΠΊΠΎΠ³Π΄Π° допускаСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚ΠΈΠΏ, опрСдСляСмый ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ. Но с Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния C++, class ΠΈ typename Π² объявлСнии ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° шаблона ΠΎΠ·Π½Π°Ρ‡Π°ΡŽΡ‚ Π² точности ΠΎΠ΄Π½ΠΎ ΠΈ Ρ‚ΠΎ ΠΆΠ΅.

Однако Π½Π΅ всСгда Π² C++ ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ слова class ΠΈ typename эквивалСнтны. Иногда Π²Ρ‹ обязаны ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ typename. Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ½ΡΡ‚ΡŒ – ΠΊΠΎΠ³Π΄Π° ΠΈΠΌΠ΅Π½Π½ΠΎ, ΠΏΠΎΠ³ΠΎΠ²ΠΎΡ€ΠΈΠΌ ΠΎ Π΄Π²ΡƒΡ… Ρ‚ΠΈΠΏΠ°Ρ… ΠΈΠΌΠ΅Π½, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΡΡΡ‹Π»Π°Ρ‚ΡŒΡΡ Π² шаблонС.

ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Ρ‡Ρ‚ΠΎ Ρƒ нас Π΅ΡΡ‚ΡŒ шаблон Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‰Π΅ΠΉ Π² качСствС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° совмСстимый с STL-ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€, содСрТащий ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ присвоСны Π²Π΅Π»ΠΈΡ‡ΠΈΠ½Π°ΠΌ Ρ‚ΠΈΠΏΠ° int. Π”Π°Π»Π΅Π΅ ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Ρ‡Ρ‚ΠΎ эта функция просто ΠΏΠ΅Ρ‡Π°Ρ‚Π°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π²Ρ‚ΠΎΡ€ΠΎΠ³ΠΎ элСмСнта. Π­Ρ‚ΠΎ Π½Π΅ ΠΎΡ‡Π΅Π½ΡŒ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚Π΅Π»ΡŒΠ½Π°Ρ функция, которая ΠΊ Ρ‚ΠΎΠΌΡƒ ΠΆΠ΅ ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π° ΠΏΠΎ-Π΄ΡƒΡ€Π°Ρ†ΠΊΠΈ. Как я ΡƒΠΆΠ΅ Π³ΠΎΠ²ΠΎΡ€ΠΈΠ», ΠΎΠ½Π° Π΄Π°ΠΆΠ΅ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ, Π½ΠΎ Π·Π°Π±ΡƒΠ΄ΡŒΡ‚Π΅ ΠΎΠ± этом Π½Π° врСмя – всС это Π½Π΅ Ρ‚Π°ΠΊ Π³Π»ΡƒΠΏΠΎ, ΠΊΠ°ΠΊ каТСтся:


template <typename C> // ΠΏΠ΅Ρ‡Π°Ρ‚Π°Π΅Ρ‚ Π²Ρ‚ΠΎΡ€ΠΎΠΉ

void print2nd(const C& container) // элСмСнт ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π°

{ // это Π½Π΅ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½Ρ‹ΠΉ C++!

if (container.size() >= 2) {

C::const_iterator iter(container.begin()); // ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€,

// ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΉ Π½Π° ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ

// элСмСнт

++iter; // ΡΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒΡΡ Π½Π° Π²Ρ‚ΠΎΡ€ΠΎΠΉ

// элСмСнт

int value = *iter; // ΡΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ элСмСнт Π² int

std::cout << value; // Π½Π°ΠΏΠ΅Ρ‡Π°Ρ‚Π°Ρ‚ΡŒ int

}

}


Π― Π²Ρ‹Π΄Π΅Π»ΠΈΠ» Π² этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π΄Π²Π΅ Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ – iter ΠΈ value. Π’ΠΈΠΏΠΎΠΌ iter являСтся C::const_iterator – ΠΎΠ½ зависит ΠΎΡ‚ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° шаблона C. ИмСна Π² шаблонС, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ зависят ΠΎΡ‚ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° шаблона, Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ зависимыми ΠΈΠΌΠ΅Π½Π°ΠΌΠΈ. ЗависимоС имя Π²Π½ΡƒΡ‚Ρ€ΠΈ класса я Π±ΡƒΠ΄Ρƒ Π½Π°Π·Ρ‹Π²Π°Ρ‚ΡŒ Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹ΠΌ зависимым ΠΈΠΌΠ΅Π½Π΅ΠΌ. C::const_iterator – это Π²Π»ΠΎΠΆΠ΅Π½Π½ΠΎΠ΅ зависимоС имя. ЀактичСски это Π΄Π°ΠΆΠ΅ Π²Π»ΠΎΠΆΠ΅Π½Π½ΠΎΠ΅ зависимоС имя Ρ‚ΠΈΠΏΠ°, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ Π²Π»ΠΎΠΆΠ΅Π½Π½ΠΎΠ΅ имя, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ относится ΠΊ Ρ‚ΠΈΠΏΡƒ.

Другая локальная пСрСмСнная Π² print2nd – value – ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚ΠΈΠΏ int, Π° int – это имя, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π½Π΅ зависит Π½ΠΈ ΠΎΡ‚ ΠΊΠ°ΠΊΠΎΠ³ΠΎ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° шаблона. Π’Π°ΠΊΠΈΠ΅ ΠΈΠΌΠ΅Π½Π° Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ нСзависимыми.

Π’Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Π΅ зависимыС ΠΈΠΌΠ΅Π½Π° ΠΌΠΎΠ³ΡƒΡ‚ ΡΡ‚Π°Ρ‚ΡŒ ΠΏΡ€ΠΈΡ‡ΠΈΠ½ΠΎΠΉ Π·Π°Ρ‚Ρ€ΡƒΠ΄Π½Π΅Π½ΠΈΠΉ Π½Π° этапС синтаксичСского Π°Π½Π°Π»ΠΈΠ·Π° исходного тСкста компилятором. НапримСр, ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅ΠΌ print2nd Π΅Ρ‰Π΅ Π±ΠΎΠ»Π΅Π΅ Π³Π»ΡƒΠΏΠΎ, написав Π² Π½Π°Ρ‡Π°Π»Π΅ Ρ‚Π°ΠΊΠΎΠΉ ΠΊΠΎΠ΄:


template <typename C> // ΠΏΠ΅Ρ‡Π°Ρ‚Π°Π΅Ρ‚ Π²Ρ‚ΠΎΡ€ΠΎΠΉ элСмСнт ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π°

void print2nd(const C& container) // это Π½Π΅ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½Ρ‹ΠΉ C++!

{

C::const_iterator *x;

...

}


Выглядит Ρ‚Π°ΠΊ, Π±ΡƒΠ΄Ρ‚ΠΎ ΠΌΡ‹ объявили x ΠΊΠ°ΠΊ Π»ΠΎΠΊΠ°Π»ΡŒΠ½ΡƒΡŽ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ – ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° C::const_iterator. Но это Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π²ΠΈΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΌΡ‹ Β«Π·Π½Π°Π΅ΠΌΒ», Ρ‡Ρ‚ΠΎ C::const_iterator являСтся Ρ‚ΠΈΠΏΠΎΠΌ. А Ρ‡Ρ‚ΠΎ, Ссли Π² классС C Π΅ΡΡ‚ΡŒ статичСский Ρ‡Π»Π΅Π½ Π΄Π°Π½Π½Ρ‹Ρ… ΠΏΠΎ ΠΈΠΌΠ΅Π½ΠΈ const_iterator ΠΈ Ρ‡Ρ‚ΠΎ, Ссли x Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠΌΠ΅Π½Π΅ΠΌ глобальной ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ? Π’ этом случаС ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠ±ΡŠΡΠ²Π»ΡΡ‚ΡŒ Π»ΠΎΠΊΠ°Π»ΡŒΠ½ΡƒΡŽ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ, Π° окаТСтся ΡƒΠΌΠ½ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ C::const_iterator Π½Π° x! Π—Π²ΡƒΡ‡ΠΈΡ‚ нСвСроятно, Π½ΠΎ это Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΠΈ Π°Π²Ρ‚ΠΎΡ€Ρ‹ синтаксичСских Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ΠΎΠ² исходного ΠΊΠΎΠ΄Π° Π½Π° C++ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΏΠΎΠ·Π°Π±ΠΎΡ‚ΠΈΡ‚ΡŒΡΡ ΠΎΠ±ΠΎ всСх Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Ρ… Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π°Ρ… Π²Ρ…ΠΎΠ΄Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ…, Π΄Π°ΠΆΠ΅ самых ΡΡƒΠΌΠ°ΡΡˆΠ΅Π΄ΡˆΠΈΡ….

Пока ΠΎ C Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ извСстно, ΠΌΡ‹ Π½Π΅ ΠΌΠΎΠΆΠ΅ΠΌ ΡƒΠ·Π½Π°Ρ‚ΡŒ, являСтся Π»ΠΈ C::const_iterator Ρ‚ΠΈΠΏΠΎΠΌ ΠΈΠ»ΠΈ Π½Π΅Ρ‚, Π° Π²ΠΎ врСмя Ρ€Π°Π·Π±ΠΎΡ€Π° шаблона print2nd компилятор Π½ΠΈΡ‡Π΅Π³ΠΎ ΠΎ C Π½Π΅ Π·Π½Π°Π΅Ρ‚. Π’ C++ прСдусмотрСно ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, Ρ€Π°Π·Ρ€Π΅ΡˆΠ°ΡŽΡ‰Π΅Π΅ эту Π½Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΡΡ‚ΡŒ: Ссли синтаксичСский Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ встрСчаСт Π²Π»ΠΎΠΆΠ΅Π½Π½ΠΎΠ΅ зависимоС имя Π² шаблонС, ΠΎΠ½ ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ это Π½Π΅ имя Ρ‚ΠΈΠΏΠ°, Ссли Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π²Ρ‹ Π½Π΅ ΡƒΠΊΠ°ΠΆΠ΅Ρ‚Π΅ это явно. По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Π΅ зависимыС ΠΈΠΌΠ΅Π½Π° Π½Π΅ ΡΠ²Π»ΡΡŽΡ‚ΡΡ Ρ‚ΠΈΠΏΠ°ΠΌΠΈ. Π•ΡΡ‚ΡŒ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΈΠ· этого ΠΏΡ€Π°Π²ΠΈΠ»Π°, ΠΎ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ я расскаТу Ρ‡ΡƒΡ‚ΡŒ Π½ΠΈΠΆΠ΅.

ИмСя это Π² Π²ΠΈΠ΄Ρƒ, посмотритС ΠΎΠΏΡΡ‚ΡŒ Π½Π° Π½Π°Ρ‡Π°Π»ΠΎ print2nd:


template <typename C>

void print2nd(const C& container)

{

if (container.size() >= 2) {

C::const_iterator iter(container.begin()); // прСдполагаСтся, Ρ‡Ρ‚ΠΎ

... // это Π½Π΅ имя Ρ‚ΠΈΠΏΠ°


Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ ясно, ΠΏΠΎΡ‡Π΅ΠΌΡƒ это Π½Π΅ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½Ρ‹ΠΉ C++. ОбъявлСниС iter ΠΈΠΌΠ΅Π΅Ρ‚ смысл Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² случаС, Ссли C::const_iterator являСтся Ρ‚ΠΈΠΏΠΎΠΌ, Π½ΠΎ ΠΌΡ‹ Π½Π΅ сообщили C++ ΠΎΠ± этом, ΠΏΠΎΡ‚ΠΎΠΌΡƒ C++ ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ это Π½Π΅ Ρ‚Π°ΠΊ. Π§Ρ‚ΠΎΠ±Ρ‹ ΠΈΡΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ ΡΠΈΡ‚ΡƒΠ°Ρ†ΠΈΡŽ, ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΡΠΎΠΎΠ±Ρ‰ΠΈΡ‚ΡŒ C++, Ρ‡Ρ‚ΠΎ C::const_iterator – это Ρ‚ΠΈΠΏ. Для этого ΠΌΡ‹ ΠΏΠΎΠΌΠ΅Ρ‰Π°Π΅ΠΌ ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово typename нСпосрСдствСнно ΠΏΠ΅Ρ€Π΅Π΄ Π½ΠΈΠΌ:


template <typename C> // это ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½Ρ‹ΠΉ Π‘++

void print2nd(const C& container)

{

if (container.size() >= 2) {

typename C::const_iterator iter(container.begin());

...

}

}


ΠžΠ±Ρ‰Π΅Π΅ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ просто: всякий Ρ€Π°Π·, ΠΊΠΎΠ³Π΄Π° Π²Ρ‹ ΠΎΠ±Ρ€Π°Ρ‰Π°Π΅Ρ‚Π΅ΡΡŒ ΠΊ Π²Π»ΠΎΠΆΠ΅Π½Π½ΠΎΠΌΡƒ зависимому ΠΈΠΌΠ΅Π½ΠΈ Π² шаблонС, Π²Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚ΡŒ Π΅Π³ΠΎ словом typename (скоро я ΠΎΠΏΠΈΡˆΡƒ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅).

Π‘Π»ΠΎΠ²ΠΎ typename слСдуСт ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Ρ… зависимых ΠΈΠΌΠ΅Π½ Ρ‚ΠΈΠΏΠΎΠ²; для Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΈΠΌΠ΅Π½ ΠΎΠ½ΠΎ Π½Π΅ примСняСтся. Π’ΠΎΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ шаблона Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ ΠΈ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€, ΠΈ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€ для этого ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π°:


template <typename C> // допускаСтся typename (ΠΊΠ°ΠΊ ΠΈ β€œclass”)

void f(const C& container, // typename Π½Π΅ допускаСтся

typename C::iterator iter); // typename трСбуСтся


C Π½Π΅ являСтся Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹ΠΌ зависимым ΠΈΠΌΠ΅Π½Π΅ΠΌ Ρ‚ΠΈΠΏΠ° (ΠΎΠ½ΠΎ Π½Π΅ Π²Π»ΠΎΠΆΠ΅Π½ΠΎ Π²Π½ΡƒΡ‚Ρ€ΡŒ Ρ‡Π΅Π³ΠΎ-Π»ΠΈΠ±ΠΎ, зависимого ΠΎΡ‚ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° шаблона), поэтому Π΅Π³ΠΎ Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΡΡ‚ΡŒ словом typename ΠΏΡ€ΠΈ объявлСнии ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π°, Π½ΠΎ C::iterator – это Π²Π»ΠΎΠΆΠ΅Π½Π½ΠΎΠ΅ зависимоС имя Ρ‚ΠΈΠΏΠ°, поэтому ΠΏΠ΅Ρ€Π΅Π΄ Π½ΠΈΠΌ слСдуСт ΠΏΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ typename.

Из ΠΏΡ€Π°Π²ΠΈΠ»Π° Β«typename Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΡΡ‚ΡŒ Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Π΅ зависимыС ΠΈΠΌΠ΅Π½Π° Ρ‚ΠΈΠΏΠΎΠ²Β» Π΅ΡΡ‚ΡŒ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅: typename Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΡΡ‚ΡŒ Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Π΅ зависимыС ΠΈΠΌΠ΅Π½Π° Ρ‚ΠΈΠΏΠΎΠ² Π² спискС Π±Π°Π·ΠΎΠ²Ρ‹Ρ… классов ΠΈΠ»ΠΈ Π² ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π΅ Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ класса Π² спискС ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Ρ‡Π»Π΅Π½ΠΎΠ². НапримСр:


template <typename T>

class Derived: public Base<T>::Nested { // список Π±Π°Π·ΠΎΠ²Ρ‹Ρ… классов:

public: // typename Π½Π΅ допускаСтся

explicit Derived(int x)

:Base<T>::Nested(x) // ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ класса

{ // Π² спискС ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Ρ‡Π»Π΅Π½ΠΎΠ²:

// typename Π½Π΅ допускаСтся

typename Base<T>::Nested temp; // использованиС влоТСнного

... // зависимого ΠΈΠΌΠ΅Π½ΠΈ Ρ‚ΠΈΠΏΠ° Π½Π΅ ΠΊΠ°ΠΊ

} // ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π° Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ

... // класса Π² спискС ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ

}; // Ρ‡Π»Π΅Π½ΠΎΠ²: typename Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ


Вакая Π½Π΅ΡΠΎΠ³Π»Π°ΡΠΎΠ²Π°Π½Π½ΠΎΡΡ‚ΡŒ нСсколько Ρ€Π°Π·Π΄Ρ€Π°ΠΆΠ°Π΅Ρ‚, Π½ΠΎ ΠΏΠΎ ΠΌΠ΅Ρ€Π΅ приобрСтСния ΠΎΠΏΡ‹Ρ‚Π° Π²Ρ‹ пСрСстанСтС Π΅Π΅ Π·Π°ΠΌΠ΅Ρ‡Π°Ρ‚ΡŒ.