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

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Π‘Ρ‚Π°Π½Π΄Π°Ρ€Ρ‚Ρ‹ программирования Π½Π° Π‘++. 101 ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ ΠΈ рСкомСндация». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 37

Автор Π“Π΅Ρ€Π± Π‘Π°Ρ‚Ρ‚Π΅Ρ€

 typename T::value_type x; // Π•Ρ‰Π΅ ΠΎΠ΄ΠΈΠ½ ΠΏΡ€ΠΈΠΌΠ΅Ρ€: созданиС

}                          // Ρ‚ΠΎΡ‡ΠΊΠΈ настройки для поиска

                           // Ρ‚ΠΈΠΏΠ° (ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ создаСтся посрСдством typedef)

Для Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π° Π°Π²Ρ‚ΠΎΡ€ Sample1 Π΄ΠΎΠ»ΠΆΠ΅Π½ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ дСйствия.

β€’ Π’Ρ‹Π·Π²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΊΠ°ΠΊ Ρ‡Π»Π΅Π½. ΠŸΡ€ΠΎΡΡ‚ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ СстСствСнный синтаксис Π²Ρ‹Π·ΠΎΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ-Ρ‡Π»Π΅Π½Π°.

β€’ Π”ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚ΠΎΡ‡ΠΊΡƒ настройки. Π’ΠΈΠΏ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΡ‚ΡŒ Π΄ΠΎΡΡ‚ΡƒΠΏΠ½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ-Ρ‡Π»Π΅Π½ foo, которая ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π²Ρ‹Π·Π²Π°Π½Π° с Π΄Π°Π½Π½Ρ‹ΠΌΠΈ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°ΠΌΠΈ (Π² Π΄Π°Π½Π½ΠΎΠΌ случаС β€” Π±Π΅Π· Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ²).

Π’Ρ‚ΠΎΡ€ΠΎΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ прСдставляСт собой использованиС ΠΌΠ΅Ρ‚ΠΎΠ΄Π° "нСявного интСрфСйса", Π½ΠΎ с функциями, Π½Π΅ ΡΠ²Π»ΡΡŽΡ‰ΠΈΠΌΠΈΡΡ Ρ‡Π»Π΅Π½Π°ΠΌΠΈ, поиск ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… выполняСтся с использованиСм ADL[3](Ρ‚.Π΅. оТидаСтся, Ρ‡Ρ‚ΠΎ данная функция находится Π² пространствС ΠΈΠΌΠ΅Π½ Ρ‚ΠΈΠΏΠ°, для ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ выполняСтся инстанцированиС шаблона). ИмСнно эта ситуация ΠΈ явилась основной ΠΏΠΎΠ±ΡƒΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ ΠΏΡ€ΠΈΡ‡ΠΈΠ½ΠΎΠΉ для ввСдСния ADL (см. Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°Ρ†ΠΈΡŽ 57). Π’Π°Ρˆ шаблон рассчитываСт Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ для ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° имССтся подходящая функция с Π·Π°Π΄Π°Π½Π½Ρ‹ΠΌ ΠΈΠΌΠ΅Π½Π΅ΠΌ:

// Π’Π°Ρ€ΠΈΠ°Π½Ρ‚ 2: Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Ρ‚ΠΎΡ‡ΠΊΠΈ настройки ΠΏΡƒΡ‚Π΅ΠΌ трСбования ΠΎΡ‚

// Ρ‚ΠΈΠΏΠ° T "fΠΎΠΎ-совмСстимости", Ρ‚.Π΅. наличия Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Π½Π΅

// ΡΠ²Π»ΡΡŽΡ‰Π΅ΠΉΡΡ Ρ‡Π»Π΅Π½ΠΎΠΌ с Π΄Π°Π½Π½Ρ‹ΠΌ ΠΈΠΌΠ΅Π½Π΅ΠΌ, сигнатурой ΠΈ

// сСмантикой, поиск ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ выполняСтся посрСдством ADL.

// (Π­Ρ‚ΠΎ СдинствСнный Π²Π°Ρ€ΠΈΠ°Π½Ρ‚, ΠΏΡ€ΠΈ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Π½Π΅ трСбуСтся поиск

// самого Ρ‚ΠΈΠΏΠ° T.)

template<typename T>

void SamplΠ΅2(T t) {

 foo(t);    // foo - Ρ‚ΠΎΡ‡ΠΊΠ° настройки

 cout << t; // Π•Ρ‰Π΅ ΠΎΠ΄ΠΈΠ½ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ - operator<< с записью Π²

}           // Π²ΠΈΠ΄Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° прСдставляСт собой Ρ‚Π°ΠΊΡƒΡŽ ΠΆΠ΅

            // Ρ‚ΠΎΡ‡ΠΊΡƒ настройки

Для Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π° 2 Π°Π²Ρ‚ΠΎΡ€ SamplΠ΅2 Π΄ΠΎΠ»ΠΆΠ΅Π½ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ дСйствия.

β€’ Π’Ρ‹Π·Π²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ с использованиСм Π½Π΅ΠΊΠ²Π°Π»ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ ΠΈΠΌΠ΅Π½ΠΈ (Π²ΠΊΠ»ΡŽΡ‡Π°Ρ использованиС СстСствСнного синтаксиса Π² случаС ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ²) ΠΈ ΡƒΠ±Π΅Π΄ΠΈΡ‚ΡŒΡΡ, Ρ‡Ρ‚ΠΎ шаблон Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ-Ρ‡Π»Π΅Π½Π° с Ρ‚Π΅ΠΌ ΠΆΠ΅ ΠΈΠΌΠ΅Π½Π΅ΠΌ. Π’ случаС шаблонов ΠΎΡ‡Π΅Π½ΡŒ Π²Π°ΠΆΠ½ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π±Ρ‹Π» Π½Π΅ ΠΊΠ²Π°Π»ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΌ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π½Π΅ слСдуСт ΠΏΠΈΡΠ°Ρ‚ΡŒ SomeNamespace::foo(t)) ΠΈ Ρ‡Ρ‚ΠΎΠ±Ρ‹ Ρƒ шаблона Π½Π΅ Π±Ρ‹Π»ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ-Ρ‡Π»Π΅Π½Π° с Ρ‚Π΅ΠΌ ΠΆΠ΅ ΠΈΠΌΠ΅Π½Π΅ΠΌ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π² ΠΎΠ±ΠΎΠΈΡ… этих случаях поиск, зависящий ΠΎΡ‚ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°, Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΏΡ€Π΅Π΄ΠΎΡ‚Π²Ρ€Π°Ρ‚ΠΈΡ‚ поиск ΠΈΠΌΠ΅Π½ΠΈ Π² пространствС ΠΈΠΌΠ΅Π½, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ находится Ρ‚ΠΈΠΏ T.

β€’ Π”ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚ΠΎΡ‡ΠΊΡƒ настройки. Π’ΠΈΠΏ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΡ‚ΡŒ Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Π½Π΅ ΡΠ²Π»ΡΡŽΡ‰Π΅ΠΉΡΡ Ρ‡Π»Π΅Π½ΠΎΠΌ, которая ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π²Ρ‹Π·Π²Π°Π½Π° с Π΄Π°Π½Π½Ρ‹ΠΌΠΈ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°ΠΌΠΈ.

Π’Π°Ρ€ΠΈΠ°Π½Ρ‚Ρ‹ 1 ΠΈ 2 ΠΈΠΌΠ΅ΡŽΡ‚ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹Π΅ прСимущСства ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΠΌΠΎΡΡ‚ΡŒ: ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π· Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ настройки для своСго Ρ‚ΠΈΠΏΠ° ΠΈ Ρ€Π°Π·ΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ Π΅Π΅ Ρ‚Π°ΠΌ, Π³Π΄Π΅ Π΅Π΅ смогут Π½Π°ΠΉΡ‚ΠΈ ΠΈ ΡˆΠ°Π±Π»ΠΎΠ½Ρ‹ Π΄Ρ€ΡƒΠ³ΠΈΡ… Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ. Π’Π΅ΠΌ самым ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ ΠΈΠ·Π±Π΅Π³Π°Π΅Ρ‚ нСобходимости ΠΏΠΈΡΠ°Ρ‚ΡŒ мноТСство ΠΌΠ΅Π»ΠΊΠΈΡ… Π°Π΄Π°ΠΏΡ‚Π΅Ρ€ΠΎΠ² для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎ. НСдостаток ΠΆΠ΅ Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π°Ρ сСмантика Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ достаточно ΡˆΠΈΡ€ΠΎΠΊΠΎ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΠΌΠ° ΠΈ ΠΈΠΌΠ΅Ρ‚ΡŒ смысл для всСх Ρ‚Π°ΠΊΠΎΠ³ΠΎ Ρ€ΠΎΠ΄Π° ΠΏΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠΉ (Π·Π°ΠΌΠ΅Ρ‚ΠΈΠΌ, Ρ‡Ρ‚ΠΎ Π² частности Π² эту ΠΊΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΡŽ ΠΏΠΎΠΏΠ°Π΄Π°ΡŽΡ‚ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹, Ρ‡Ρ‚ΠΎ являСтся Π΅Ρ‰Π΅ ΠΎΠ΄Π½ΠΎΠΉ ΠΏΡ€ΠΈΡ‡ΠΈΠ½ΠΎΠΉ для Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°Ρ†ΠΈΠΈ 26).

Π’Ρ€Π΅Ρ‚ΠΈΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² использовании спСциализации, ΠΊΠΎΠ³Π΄Π° ваш шаблон полагаСтся Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ Ρ‚ΠΈΠΏ спСциализируСт (ΠΏΡ€ΠΈ нСобходимости) Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΠ½ΠΎΠΉ прСдоставлСнный Π²Π°ΠΌΠΈ шаблон класса.

// Π’Π°Ρ€ΠΈΠ°Π½Ρ‚ 3: Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Ρ‚ΠΎΡ‡ΠΊΠΈ настройки ΠΏΡƒΡ‚Π΅ΠΌ трСбования ΠΎΡ‚

// Ρ‚ΠΈΠΏΠ° T "foo-совмСстимости" ΠΏΡƒΡ‚Π΅ΠΌ спСциализации шаблона

// SampleTraits<> с прСдоставлСниСм (ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ статичСской)

// Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ с Π΄Π°Π½Π½Ρ‹ΠΌ ΠΈΠΌΠ΅Π½Π΅ΠΌ, сигнатурой ΠΈ сСмантикой.

template<typename T>

void SamplΠ΅3(T t) {

 S3Traits<T>::foo(t);                // S3Traits<>::foo -

                                     // Ρ‚ΠΎΡ‡ΠΊΠ° настройки

 typename S3Traits<T>::value_type x; // Π”Ρ€ΡƒΠ³ΠΎΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ -

}                                    // Ρ‚ΠΎΡ‡ΠΊΠ° настройки для поиска Ρ‚ΠΈΠΏΠ° (ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ

                                     // создаСтся посрСдством typedef)

Π’ этом Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ ΠΏΠΈΡˆΠ΅Ρ‚ Π°Π΄Π°ΠΏΡ‚Π΅Ρ€, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΈΠ·ΠΎΠ»ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΡΡ‚ΡŒ ΠΊΠΎΠ΄Π° настройки для Π΄Π°Π½Π½ΠΎΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Π² ΠΏΡ€Π΅Π΄Π΅Π»Π°Ρ… этой Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ. Π‘ΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ нСдостаток Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ это ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ слишком Π³Ρ€ΠΎΠΌΠΎΠ·Π΄ΠΊΠΈΠΌ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ΠΌ; Ссли нСсколько Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ шаблонов Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ ΠΎΠ΄Π½Ρƒ ΠΈ Ρ‚Ρƒ ΠΆΠ΅ ΠΎΠ±Ρ‰ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ, ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΈΡΠ°Ρ‚ΡŒ нСсколько Π°Π΄Π°ΠΏΡ‚Π΅Ρ€ΠΎΠ², ΠΏΠΎ ΠΎΠ΄Π½ΠΎΠΌΡƒ для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ.

Для Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ этой вСрсии Π°Π²Ρ‚ΠΎΡ€ SamplΠ΅3 Π΄ΠΎΠ»ΠΆΠ΅Π½ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ дСйствия.

β€’ ΠŸΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ шаблон класса ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π² собствСнном пространствС ΠΈΠΌΠ΅Π½ шаблона. НС ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ ΡˆΠ°Π±Π»ΠΎΠ½Ρ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ нСльзя частично ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ приводят ΠΊ ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠ·ΠΊΠ°ΠΌ ΠΈ зависимостям ΠΎΡ‚ порядка (см. Ρ‚Π°ΠΊΠΆΠ΅ Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°Ρ†ΠΈΡŽ 66).

β€’ Π”ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚ΠΎΡ‡ΠΊΡƒ настройки. ΠŸΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ S3Traits для своСго собствСнного Ρ‚ΠΈΠΏΠ° Π² пространствС ΠΈΠΌΠ΅Π½ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ шаблонов, ΠΈ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ всС Ρ‡Π»Π΅Π½Ρ‹ S3Traits (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, foo) ΠΈ ΠΈΡ… сСмантику.

ΠŸΡ€ΠΈ использовании любого ΠΈΠ· пСрСчислСнных Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠ² слСдуСт Ρ‚Π°ΠΊΠΆΠ΅ Ρ‡Π΅Ρ‚ΠΊΠΎ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ сСмантику, Ρ‚Ρ€Π΅Π±ΡƒΠ΅ΠΌΡƒΡŽ ΠΎΡ‚ foo, Π² особСнности всС сущСствСнныС дСйствия (постусловия), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΄ΠΎΠ»ΠΆΠ½Π° Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ эта функция, ΠΈ сСмантику сбоСв (Ρ‡Ρ‚ΠΎ ΠΈΠΌΠ΅Π½Π½ΠΎ происходит ΠΏΡ€ΠΈ сбоС ΠΈ ΠΊΠ°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΠΎΡΡƒΡ‰Π΅ΡΡ‚Π²Π»ΡΡ‚ΡŒΡΡ ΠΎΠΏΠΎΠ²Π΅Ρ‰Π΅Π½ΠΈΠ΅ ΠΎΠ± ΠΎΡˆΠΈΠ±ΠΊΠ°Ρ…).

Если Ρ‚ΠΎΡ‡ΠΊΠ° настройки Π΄ΠΎΠ»ΠΆΠ½Π° Π΄Π΅ΠΉΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ ΠΈ для встроСнных Ρ‚ΠΈΠΏΠΎΠ², ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρ‹ 2 ΠΈ 3.

Π’Π°Ρ€ΠΈΠ°Π½Ρ‚Ρ‹ 1 ΠΈ 2 слСдуСт ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡Π΅ΡΡ‚ΡŒ для Ρ‚Π΅Ρ… ΠΎΠ±Ρ‰ΠΈΡ… ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡΠ²Π»ΡΡŽΡ‚ΡΡ прСдоставляСмыми Ρ‚ΠΈΠΏΠΎΠΌ сСрвисами. Для принятия Π΄Π°Π½Π½ΠΎΠ³ΠΎ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΏΠΎΠΏΡ€ΠΎΠ±ΡƒΠΉΡ‚Π΅ ΠΎΡ‚Π²Π΅Ρ‚ΠΈΡ‚ΡŒ Π½Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ вопросы: ΠΌΠΎΠ³ΡƒΡ‚ Π»ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ шаблонов ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΄Π°Π½Π½ΡƒΡŽ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ? являСтся Π»ΠΈ рассматриваСмая сСмантика ΠΏΡ€ΠΈΠ΅ΠΌΠ»Π΅ΠΌΠΎΠΉ для Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΈΠΌΠ΅Π½ΠΈ Π² ΠΎΠ±Ρ‰Π΅ΠΌ случаС? Если Π²Ρ‹ ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΎΡ‚Π²Π΅Ρ‚ΠΈΠ»ΠΈ Π½Π° эти вопросы, Ρ‚ΠΎ, вСроятно, Π²Π°ΠΌ Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ слСдуСт ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡Π΅ΡΡ‚ΡŒ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· этих Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠ².

Π’Π°Ρ€ΠΈΠ°Π½Ρ‚ 3 Π»ΡƒΡ‡ΡˆΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для ΠΌΠ΅Π½Π΅Π΅ ΠΎΠ±Ρ‰ΠΈΡ… ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ, смысл ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΌΠΎΠΆΠ΅Ρ‚ Π²Π°Ρ€ΡŒΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ. Π’ Ρ‚Π°ΠΊΠΎΠΌ случаС Π² Π΄Ρ€ΡƒΠ³ΠΎΠΌ пространствС ΠΈΠΌΠ΅Π½ Π±Π΅Π· ΠΊΠ°ΠΊΠΈΡ…-Π»ΠΈΠ±ΠΎ ΠΊΠΎΠ»Π»ΠΈΠ·ΠΈΠΉ Π²Ρ‹ смоТСтС ΠΏΡ€ΠΈΠ΄Π°Ρ‚ΡŒ Ρ‚ΠΎΠΌΡƒ ΠΆΠ΅ ΠΈΠΌΠ΅Π½ΠΈ ΠΈΠ½ΠΎΠΉ смысл.

Π¨Π°Π±Π»ΠΎΠ½, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ имССтся нСсколько Ρ‚ΠΎΡ‡Π΅ΠΊ настройки, для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΈΠ· Π½ΠΈΡ… ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ свою ΡΡ‚Ρ€Π°Ρ‚Π΅Π³ΠΈΡŽ, Π² наибольшСй ΠΌΠ΅Ρ€Π΅ ΠΏΡ€ΠΈΠ΅ΠΌΠ»Π΅ΠΌΡƒΡŽ Π² Π΄Π°Π½Π½ΠΎΠΌ мСстС. Π“Π»Π°Π²Π½ΠΎΠ΅, Ρ‡Ρ‚ΠΎ Π²Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ осознанно, с ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΠ΅ΠΌ Π²Ρ‹Π±ΠΈΡ€Π°Ρ‚ΡŒ ΡΡ‚Ρ€Π°Ρ‚Π΅Π³ΠΈΡŽ для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Ρ‚ΠΎΡ‡ΠΊΠΈ настройки, Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ трСбования ΠΊ настройкС (Π²ΠΊΠ»ΡŽΡ‡Π°Ρ ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌΡ‹Π΅ постусловия ΠΈ сСмантику ошибок) ΠΈ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π²Ρ‹Π±Ρ€Π°Π½Π½ΡƒΡŽ Π²Π°ΠΌΠΈ ΡΡ‚Ρ€Π°Ρ‚Π΅Π³ΠΈΡŽ.

Для Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ Π½Π΅ΠΏΡ€Π΅Π΄Π½Π°ΠΌΠ΅Ρ€Π΅Π½Π½Ρ‹Ρ… Ρ‚ΠΎΡ‡Π΅ΠΊ настройки, слСдуСт ΠΏΡ€ΠΈΠ΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒΡΡ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… ΠΏΡ€Π°Π²ΠΈΠ».

β€’ Π Π°Π·ΠΌΠ΅Ρ‰Π°ΠΉΡ‚Π΅ всС ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Π΅ вашим шаблоном Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² ΠΈΡ… собствСнном Π²Π»ΠΎΠΆΠ΅Π½Π½ΠΎΠΌ пространствС ΠΈΠΌΠ΅Π½, ΠΈ Π²Ρ‹Π·Ρ‹Π²Π°ΠΉΡ‚Π΅ ΠΈΡ… посрСдством ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ ΠΊΠ²Π°Π»ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ… ΠΈΠΌΠ΅Π½ для Π·Π°ΠΏΡ€Π΅Ρ‚Π° ADL. Если Π²Ρ‹ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚Π΅ Π²Π°ΡˆΡƒ Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅Ρ‚Π΅ Π΅ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Ρ‚ΠΈΠΏΠ° ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° шаблона, ΠΈ этот Π²Ρ‹Π·ΠΎΠ² Π½Π΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ Ρ‚ΠΎΡ‡ΠΊΠΎΠΉ настройки (Ρ‚.Π΅. Π²Ρ‹ всСгда Π½Π°ΠΌΠ΅Ρ€Π΅Π½Ρ‹ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ Π²Π°ΡˆΡƒ Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, Π° Π½Π΅ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΈΠ½ΡƒΡŽ), Ρ‚ΠΎ Π»ΡƒΡ‡ΡˆΠ΅ ΠΏΠΎΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ эту Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Π²ΠΎ Π²Π»ΠΎΠΆΠ΅Π½Π½ΠΎΠ΅ пространство ΠΈΠΌΠ΅Π½ ΠΈ явно Π·Π°ΠΏΡ€Π΅Ρ‚ΠΈΡ‚ΡŒ ADL, ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ ΠΊΠ²Π°Π»ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Π² имя Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈΠ»ΠΈ взяв Π΅Π³ΠΎ Π² скобки:

template<typename T>

void SamplΠ΅4(T t) {

 S4Helpers::bar(t); // Π—Π°ΠΏΡ€Π΅Ρ‚ ADL: bar Π½Π΅ являСтся

                    // Ρ‚ΠΎΡ‡ΠΊΠΎΠΉ настройки

 (bar)(t);          // ΠΠ»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π½Ρ‹ΠΉ способ

}

β€’ Π˜Π·Π±Π΅Π³Π°ΠΉΡ‚Π΅ зависимости ΠΎΡ‚ зависимых ΠΈΠΌΠ΅Π½. Говоря Π½Π΅Ρ„ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎ, зависимоС имя β€” это имя, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΊΠ°ΠΊΠΈΠΌ-Ρ‚ΠΎ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ΡƒΠΏΠΎΠΌΠΈΠ½Π°Π΅Ρ‚ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ шаблона. МногиС компиляторы Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ "Π΄Π²ΡƒΡ…Ρ„Π°Π·Π½Ρ‹ΠΉ поиск" для зависимых ΠΈΠΌΠ΅Π½ ΠΈΠ· стандарта Π‘++, Π° это ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΊΠΎΠ΄ шаблона, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΠΉ зависимыС ΠΈΠΌΠ΅Π½Π°, Π±ΡƒΠ΄Π΅Ρ‚ вСсти сСбя ΠΏΠΎ-Ρ€Π°Π·Π½ΠΎΠΌΡƒ Π½Π° Ρ€Π°Π·Π½Ρ‹Ρ… компиляторах, Ссли Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π΅ ΠΏΡ€ΠΈΠ½ΡΡ‚ΡŒ ΠΌΠ΅Ρ€Ρ‹ для ΠΏΠΎΠ»Π½ΠΎΠΉ опрСдСлСнности ΠΏΡ€ΠΈ использовании зависимых ΠΈΠΌΠ΅Π½. Π’ частности, особого внимания Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ зависимых Π±Π°Π·ΠΎΠ²Ρ‹Ρ… классов, ΠΊΠΎΠ³Π΄Π° шаблон класса наслСдуСтся ΠΎΡ‚ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ· ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² этого шаблона (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, T Π² случаС template<typename T>class Π‘:T{};) ΠΈΠ»ΠΈ ΠΎΡ‚ Ρ‚ΠΈΠΏΠ°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ построСн с использованиСм ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ· ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² шаблона (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, X<T> Π² случаС template<typename T>class C:X<T>{};).

ΠšΠΎΡ€ΠΎΡ‚ΠΊΠΎ говоря, ΠΏΡ€ΠΈ ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠΈ ΠΊ Π»ΡŽΠ±ΠΎΠΌΡƒ Ρ‡Π»Π΅Π½Ρƒ зависимого Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ класса Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ всСгда явно ΠΊΠ²Π°Π»ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ имя с использованиСм ΠΈΠΌΠ΅Π½ΠΈ Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ класса ΠΈΠ»ΠΈ ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ this->. Π­Ρ‚ΠΎΡ‚ способ ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒ просто ΠΊΠ°ΠΊ Π½Π΅ΠΊΡƒΡŽ магию, которая заставляСт всС компиляторы Π΄Π΅Π»Π°Ρ‚ΡŒ ΠΈΠΌΠ΅Π½Π½ΠΎ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π²Ρ‹ ΠΎΡ‚ Π½ΠΈΡ… Ρ…ΠΎΡ‚ΠΈΡ‚Π΅.

template<typename T>

class Π‘ : X<T> {

 typename X<T>::SomeType s; // ИспользованиС Π²Π»ΠΎΠΆΠ΅Π½Π½ΠΎΠ³ΠΎ