ΡˆΠ°Π±Π»ΠΎΠ½Ρ‹ с ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌ числом ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² c

Π¨Π°Π±Π»ΠΎΠ½Ρ‹ с ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌ количСством Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² Π² C++11


Автор: Π‘Π°Π΄ΠΎΠ²Π½ΠΈΠΊΠΎΠ² Π‘Π΅Ρ€Π³Π΅ΠΉ ΠœΠΈΡ…Π°ΠΉΠ»ΠΎΠ²ΠΈΡ‡
ΠŸΠ΅Ρ€Π΅Π²ΠΎΠ΄:
Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ:
ΠœΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π» прСдоставил:

ΠžΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Π½ΠΎ: 14.05.2012
Π˜ΡΠΏΡ€Π°Π²Π»Π΅Π½ΠΎ: 10.12.2016
ВСрсия тСкста: 1.3

Π’Π΅, ΠΊΡ‚ΠΎ Ρ‡ΠΈΡ‚Π°Π» ΠΊΠ½ΠΈΠ³Ρƒ АндрСя АлСксандрСску Β«Π‘ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π½Π° C++Β», Π·Π½Π°ΡŽΡ‚, Ρ‡Ρ‚ΠΎ сущСствуСт ΠΎΠ±ΡˆΠΈΡ€Π½Ρ‹ΠΉ класс Π·Π°Π΄Π°Ρ‡ (Π² области мСтапрограммирования с использованиСм шаблонов), ΠΊΠΎΠ³Π΄Π° ΡˆΠ°Π±Π»ΠΎΠ½Ρƒ ΠΏΡ€ΠΈ Π²ΠΎΠΏΠ»ΠΎΡ‰Π΅Π½ΠΈΠΈ (instantiation) Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠ΅ (Π·Π°Ρ€Π°Π½Π΅Π΅ нСизвСстноС) количСство Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ². Π’ΠΈΠΏΠΈΡ‡Π½Ρ‹Π΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ Ρ‚Π°ΠΊΠΈΡ… Π·Π°Π΄Π°Ρ‡:

Π’ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Ρ‚Π°ΠΊΠΎΠΉ Π·Π°Π΄Π°Ρ‡Π΅ Ρ‚ΠΎΡ‡Π½ΠΎΠ΅ количСство ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ², ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Π΅ΠΌΡ‹Ρ… ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΌΡƒ ΡˆΠ°Π±Π»ΠΎΠ½Ρƒ Π² качСствС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ², Π·Π°Ρ€Π°Π½Π΅Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ слоТно. И, Π²ΠΎΠΎΠ±Ρ‰Π΅ говоря, зависит ΠΎΡ‚ ТСлания ΠΈ потрСбностСй Ρ‚ΠΎΠ³ΠΎ, ΠΊΡ‚ΠΎ намСрСваСтся ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ ΡˆΠ°Π±Π»ΠΎΠ½Π½Ρ‹ΠΉ класс.Π’ Ρ€Π°ΠΌΠΊΠ°Ρ… Π΄Π΅ΠΉΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ стандарта Π‘++ сколь-Π½ΠΈΠ±ΡƒΠ΄ΡŒ ΡƒΠ΄ΠΎΠ±Π½ΠΎΠ³ΠΎ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ Ρ‚Π°ΠΊΠΈΡ… Π·Π°Π΄Π°Ρ‡ Π½Π΅ сущСствуСт. Π¨Π°Π±Π»ΠΎΠ½Ρ‹ ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ строго ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½ΠΎΠ΅ количСство ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² ΠΈ Π½ΠΈΠΊΠ°ΠΊ ΠΈΠ½Π°Ρ‡Π΅. А. АлСксандрСску (Π² упомянутой Π²Ρ‹ΡˆΠ΅ ΠΊΠ½ΠΈΠ³Π΅) ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅Ρ‚ ΠΎΠ±Ρ‰Π΅Π΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅, основанноС Π½Π° Ρ‚Π°ΠΊ Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΡ‹Ρ… «списках Ρ‚ΠΈΠΏΠΎΠ²Β», Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Ρ‚ΠΈΠΏΡ‹ прСдставлСны Π² Π²ΠΈΠ΄Π΅ односвязного списка, Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ посрСдством рСкурсивных шаблонов. ΠΠ»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π½Ρ‹ΠΌ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ΠΌ (ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΌ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π² boost::variant ΠΈ boost::tuple) являСтся объявлСниС шаблонного класса с большим количСством ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ (всСм, ΠΊΡ€ΠΎΠΌΠ΅ ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ) присвоСно Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ. Оба этих Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΏΠΎΠ»ΠΎΠ²ΠΈΠ½Ρ‡Π°Ρ‚Ρ‹ΠΌΠΈ ΠΈ Π½Π΅ ΠΎΡ…Π²Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‚ вСсь спСктр Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Ρ… Π·Π°Π΄Π°Ρ‡. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ для устранСния нСдостатков ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΉ ΠΈ упрощСния ΠΊΠΎΠ΄Π° Π½ΠΎΠ²Ρ‹ΠΉ стандарт ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅Ρ‚ Π‘++-Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°ΠΌ Π½ΠΎΠ²Ρ‹ΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ объявлСния шаблонов: Β«ΡˆΠ°Π±Π»ΠΎΠ½Ρ‹ с ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌ количСством ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ²Β» ΠΈΠ»ΠΈ, Π² ΠΎΡ€ΠΈΠ³ΠΈΠ½Π°Π»Π΅, Β«variadic templatesΒ».

ΠŸΡ€ΠΎΡΡ‚Ρ‹Π΅ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρ‹ использования

ОбъявлСниС шаблона с ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌ количСством ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² выглядит ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹ΠΌ ΠΆΠ΅ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ΠΎΠ±ΡŠΡΠ²Π»ΡΡŽΡ‚ΡΡ ΡˆΠ°Π±Π»ΠΎΠ½Ρ‹ с ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌ количСством ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ²-Π½Π΅ Ρ‚ΠΈΠΏΠΎΠ²:

Π—Π΄Π΅ΡΡŒ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ эмуляция ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠ³ΠΎ Π² Ρ€Π°ΠΌΠΊΠ°Ρ… стандарта 2003-Π³ΠΎ Π³ΠΎΠ΄Π° β€” вСсьма Π½Π΅Ρ‚Ρ€ΠΈΠ²ΠΈΠ°Π»ΡŒΠ½Π°Ρ Π·Π°Π΄Π°Ρ‡Π° (Ссли Π½Π΅ ΡΠΊΠ°Π·Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ нСвыполнимая).

Помимо ΡˆΠ°Π±Π»ΠΎΠ½Π½Ρ‹Ρ… классов, ΠΌΠΎΠΆΠ½ΠΎ Ρ‚Π°ΠΊΠΆΠ΅ ΠΎΠ±ΡŠΡΠ²Π»ΡΡ‚ΡŒ ΡˆΠ°Π±Π»ΠΎΠ½Π½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ с ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌ количСством ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ². ΠŸΠΎΠ΄ΠΎΠ±Π½Ρ‹Π΅ объявлСния ΠΌΠΎΠ³ΡƒΡ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

ΠžΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎ, Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ³ΠΎ Ρ€ΠΎΠ΄Π° ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ шаблонов (ΠΎΠ½ΠΈ Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ Β«ΠΏΠ°ΠΊΠ΅Ρ‚Π°ΠΌΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ²Β» ΠΈΠ»ΠΈ Β«parameter packsΒ») Π½Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π²Π΅Π·Π΄Π΅, Π³Π΄Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Π΅ (ΠΎΠ΄ΠΈΠ½ΠΎΡ‡Π½Ρ‹Π΅) ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ шаблонов. Допустимо использованиС ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ² ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… контСкстах:

Атрибуты (attributes) – Π½ΠΎΠ²ΠΎΠ΅ понятиС, появившССся Π² C++11. ΠŸΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ‚ Π°ΡΡΠΎΡ†ΠΈΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ с Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌΠΈ конструкциями языка (Ρ‚ΠΈΠΏΠ°ΠΌΠΈ, ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌΠΈ, дСкларациями, Π±Π»ΠΎΠΊΠ°ΠΌΠΈ ΠΈΠ»ΠΈ Π΅Π΄ΠΈΠ½ΠΈΡ†Π°ΠΌΠΈ трансляции) Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ. НапримСр, Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ [[noreturn]], Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π½Ρ‹ΠΉ ΠΊ Π΄Π΅ΠΊΠ»Π°Ρ€Π°Ρ†ΠΈΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ функция Π½ΠΈΠΊΠΎΠ³Π΄Π° (ΠΏΡ€ΠΈ ΡˆΡ‚Π°Ρ‚Π½ΠΎΠΉ Ρ€Π°Π±ΠΎΡ‚Π΅) Π½Π΅ Π²Π΅Ρ€Π½Ρ‘Ρ‚ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅.

Π’ зависимости ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, Π³Π΄Π΅ ΠΈΠΌΠ΅Π½Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΏΠ°ΠΊΠ΅Ρ‚ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ², ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚ΠΈΡ€ΡƒΡŽΡ‚ΡΡ элСмСнты этого ΠΏΠ°ΠΊΠ΅Ρ‚Π°. Π‘Π°ΠΌΠΎ использованиС ΠΏΠ°ΠΊΠ΅Ρ‚Π° ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² называСтся «раскрытиСм ΠΏΠ°ΠΊΠ΅Ρ‚Π°Β» (pack expansion) ΠΈ записываСтся Π² ΠΊΠΎΠ΄Π΅ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

Π“Π΄Π΅ Types β€” это Π½Π°Π·Π²Π°Π½ΠΈΠ΅ ΠΏΠ°ΠΊΠ΅Ρ‚Π° ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ².

НапримСр, для Ρ‚Π°ΠΊΠΎΠ³ΠΎ объявлСния шаблона:

Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Π΅ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρ‹ раскрытия ΠΏΠ°ΠΊΠ΅Ρ‚Π° ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² ΠΌΠΎΠ³ΡƒΡ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ Ρ‚Π°ΠΊ:

Под Ρ‚Π΅Ρ€ΠΌΠΈΠ½ΠΎΠΌ Β«ΠΏΠ°Ρ‚Ρ‚Π΅Ρ€Π½Β» здСсь понимаСтся Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ ΠΊΠΎΠ΄Π°, ΠΎΠΊΡ€ΡƒΠΆΠ°ΡŽΡ‰Π΅Π³ΠΎ имя ΠΏΠ°ΠΊΠ΅Ρ‚Π° ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΡΡ‚ΡŒΡΡ ΠΏΡ€ΠΈ раскрытии ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ ΠΏΠ°ΠΊΠ΅Ρ‚Π°. Π’ ΠΏΡ€ΠΈΠ²Π΅Π΄Ρ‘Π½Π½ΠΎΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅, Ссли провСсти раскрытиС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ, Ρ‚ΠΎ получится, Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Π²ΠΎΠΏΠ»ΠΎΡ‰Π΅Π½ΠΈΠ΅ шаблона:

Π‘ΡƒΠ΄Π΅Ρ‚ раскрыто ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

Π’Π½Π΅ зависимости ΠΎΡ‚ контСкста, Π² процСссС раскрытия ΠΏΠ°ΠΊΠ΅Ρ‚Π° ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² Π² качСствС раздСлитСля элСмСнтов компилятор ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Π·Π°ΠΏΡΡ‚ΡƒΡŽ.

ΠŸΡ€ΠΎΡΡ‚ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ‚ΠΎΡ€ Π½Π° variadic templates

Π’ качСствС достаточно простого ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° использования шаблонов с ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌ числом ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² ΠΌΠΎΠΆΠ½ΠΎ привСсти Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ Ρ„ΡƒΠ½ΠΊΡ‚ΠΎΡ€Π°. Выглядит эта рСализация ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ выполнСния этого ΠΊΠΎΠ΄Π° Π²ΠΏΠΎΠ»Π½Π΅ ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌΡ‹ΠΉ:

Π° ΠΊΠΎΠ΄ β€” простой ΠΈ понятный. Для сравнСния ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„Π°ΠΉΠ»Ρ‹ с Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ boost::function.

ΠžΠΏΠΈΡΠ°Π½Π½Ρ‹Π΅ Π²Ρ‹ΡˆΠ΅ ΡˆΠ°Π±Π»ΠΎΠ½Ρ‹ нСслоТно ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ для ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ Π½Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ-Ρ‡Π»Π΅Π½Ρ‹:

ΠŸΡ€ΠΈΠ²Π΅Π΄Ρ‘Π½Π½Ρ‹ΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ достаточно прост ΠΈ наглядно дСмонстрируСт основныС возмоТности шаблонов с ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌ количСством ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ². Анализируя Π΅Π³ΠΎ, ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ ΠΎΠ±Ρ‰ΡƒΡŽ схСму использования шаблонов с ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌ количСством ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ²:

1. ДСкларируСтся Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ ΠΎΠ±Ρ‰ΠΈΠΉ шаблон, послСдний ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ описываСтся Π² Π²ΠΈΠ΄Π΅ ΠΏΠ°ΠΊΠ΅Ρ‚Π° ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ². Π’ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ это:

2. ΠžΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ΡΡ частичныС спСциализации этого шаблона, ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚ΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠ΅ Ρ‚Ρƒ ΠΈΠ»ΠΈ ΠΈΠ½ΡƒΡŽ Ρ‡Π°ΡΡ‚ΡŒ ΠΏΠ°ΠΊΠ΅Ρ‚Π° ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ². Π’ ΠΏΡ€ΠΈΠ²Π΅Π΄Ρ‘Π½Π½ΠΎΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ это ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅:

3. Π’ рядС случаСв ΠΏΡ€ΠΈ спСциализации ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΡƒΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΏΠ°ΠΊΠ΅Ρ‚ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ пустым. Π’Π°ΠΊΠΎΠ΅, Π²ΠΎΠΎΠ±Ρ‰Π΅ говоря, допустимо.

ΠŸΠ Π˜ΠœΠ•Π§ΠΠΠ˜Π•

ΠŸΡ€ΠΈ этом Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΠΎΠΌΠ½ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π² случаС с ΡˆΠ°Π±Π»ΠΎΠ½Π½Ρ‹ΠΌΠΈ классами, ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹, ΡƒΠΏΠ°ΠΊΠΎΠ²Π°Π½Π½Ρ‹Π΅ Π² ΠΏΠ°ΠΊΠ΅Ρ‚, ΠΌΠΎΠ³ΡƒΡ‚ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ, начиная с Π³ΠΎΠ»ΠΎΠ²Ρ‹ ΠΏΠ°ΠΊΠ΅Ρ‚Π°. ΠšΠΎΠ½ΠΊΡ€Π΅Ρ‚ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹, начиная с хвоста ΠΏΠ°ΠΊΠ΅Ρ‚Π°, Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ (Π² силу Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ ΠΏΠ°ΠΊΠ΅Ρ‚ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² ΠΌΠΎΠΆΠ΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π·Π°ΠΌΡ‹ΠΊΠ°Ρ‚ΡŒ список ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² шаблона). Π’ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠΈ ΡˆΠ°Π±Π»ΠΎΠ½Π½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Ρ‚Π°ΠΊΠΎΠ³ΠΎ ограничСния Π½Π΅Ρ‚.

Π‘ΠΎΠ»Π΅Π΅ слоТныС случаи

Как ΠΎΡ‚ΠΌΠ΅Ρ‡Π°Π»ΠΎΡΡŒ Π²Ρ‹ΡˆΠ΅, ΠΏΠ°ΠΊΠ΅Ρ‚Ρ‹ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² ΠΌΠΎΠ³ΡƒΡ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚ΠΈΠΏΡ‹, Π½ΠΎ ΠΈ Π½Π΅-Ρ‚ΠΈΠΏΡ‹. НапримСр:

ΠΏΠ΅Ρ‡Π°Ρ‚Π°Π΅Ρ‚ Π½Π° консоль ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌΡ‹Π΅

ΠŸΡ€ΠΈ раскрытии ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ² ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ слоТныС ΠΏΠ°Ρ‚Ρ‚Π΅Ρ€Π½Ρ‹. НапримСр, Π² ΠΏΡ€ΠΈΠ²Π΅Π΄Ρ‘Π½Π½ΠΎΠΌ Π²Ρ‹ΡˆΠ΅ ΠΊΠΎΠ΄Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ Π·Π°ΠΌΠ΅Π½Ρƒ:

Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈΠ²Π΅Π΄Ρ‘Ρ‚ ΠΊ Π²Ρ‹Π²ΠΎΠ΄Ρƒ Π½Π° экран Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ:

100 200 300 400 500

ΠŸΠ Π˜ΠœΠ•Π§ΠΠΠ˜Π•

Π’ΠΎΠΎΠ±Ρ‰Π΅, ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΉ Π²ΠΈΠ΄ ΠΏΠ°Ρ‚Ρ‚Π΅Ρ€Π½Π° зависит ΠΎΡ‚ контСкста, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΎΠ½ раскрываСтся. Π‘ΠΎΠ»Π΅Π΅ Ρ‚ΠΎΠ³ΠΎ, ΠΏΠ°Ρ‚Ρ‚Π΅Ρ€Π½ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ ΡƒΠΏΠΎΠΌΠΈΠ½Π°Π½ΠΈΠ΅ Π±ΠΎΠ»Π΅Π΅ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΏΠ°ΠΊΠ΅Ρ‚Π° ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ². Π’ этом случаС всС упомянутыС Π² ΠΏΠ°Ρ‚Ρ‚Π΅Ρ€Π½Π΅ ΠΏΠ°ΠΊΠ΅Ρ‚Ρ‹ Π±ΡƒΠ΄ΡƒΡ‚ Ρ€Π°ΡΠΊΡ€Ρ‹Π²Π°Ρ‚ΡŒΡΡ синхронно, Π° ΠΏΠΎΡ‚ΠΎΠΌΡƒ количСство фактичСских ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² Π² Π½ΠΈΡ… Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΡΠΎΠ²ΠΏΠ°Π΄Π°Ρ‚ΡŒ.

РСализация ΡƒΠ½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ Ρ„ΡƒΠ½ΠΊΡ‚ΠΎΡ€Π°-ΠΊΠΎΠΌΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€Π°

ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΎΡ€Π³Π°Π½ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΡƒΠ½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½Ρ‹ΠΉ Ρ„ΡƒΠ½ΠΊΡ‚ΠΎΡ€-ΠΊΠΎΠΌΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€, Π·Π°Π΄Π°Ρ‡Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ β€” ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ Π² Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ выполнСния Π·Π°Π΄Π°Π½Π½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ для Π½Π΅ΠΊΠΎΠ΅Π³ΠΎ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°. ΠŸΡƒΡΡ‚ΡŒ сущСствуСт Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½Π°Π±ΠΎΡ€ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ:

НСобходимо Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΡƒΠ½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½Ρ‹ΠΉ Ρ„ΡƒΠ½ΠΊΡ‚ΠΎΡ€, ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π²Ρ‹Π·ΠΎΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΊ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΠ»ΠΎ Π±Ρ‹ ΠΊ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΡŽ Ρ‚Π°ΠΊΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°:

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

ΠŸΠ΅Ρ€Π²ΡƒΡŽ Π·Π°Π΄Π°Ρ‡Ρƒ, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Ρ€Π΅ΡˆΠΈΡ‚ΡŒ β€” это ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ способа сохранСния Π΄Π°Π½Π½Ρ‹Ρ…, ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. Для этого ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ΡŒ мноТСствСнноС наслСдованиС ΠΎΡ‚ классов, нСпосрСдствСнно хранящих Π΄Π°Π½Π½Ρ‹Π΅ Π·Π°Π΄Π°Π½Π½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ°:

Но Π΅ΡΡ‚ΡŒ нСкоторая ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ: Ссли Π² спискС ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Π΅ΠΌΡ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΏΡ€ΠΈΡΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‚ нСсколько Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, Ρ‚ΠΈΠΏΡ‹ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΡΠΎΠ²ΠΏΠ°Π΄Π°ΡŽΡ‚, Ρ‚ΠΎ ΠΊΠΎΠ΄ Π½Π΅ скомпилируСтся, Ρ‚. ΠΊ. Π² спискС Π±Π°Π·ΠΎΠ²Ρ‹Ρ… классов Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΈΡΡƒΡ‚ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ΄ΠΈΠ½ ΠΈ Ρ‚ΠΎΡ‚ ΠΆΠ΅ класс. Для устранСния этой нСоднозначности Ρ‚ΠΈΠΏΡ‹ Π² ΠΏΠ°ΠΊΠ΅Ρ‚Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΎΠΈΠ½Π΄Π΅ΠΊΡΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ. Для этого Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ Ρ‚ΠΈΠΏ Β«ΠΊΠΎΡ€Ρ‚Π΅ΠΆ Ρ†Π΅Π»Ρ‹Ρ… чисСл», содСрТащий числа ΠΎΡ‚ 0 Π΄ΠΎ Π·Π°Π΄Π°Π½Π½ΠΎΠ³ΠΎ Π² качСствС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° N:

Π’ ΠΈΡ‚ΠΎΠ³Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ этот шаблон ΠΌΠΎΠΆΠ½ΠΎ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

ΠŸΡ€ΠΈ этом Indexes Π±ΡƒΠ΄Π΅Ρ‚ эквивалСнтно:

Π§Ρ‚ΠΎΠ±Ρ‹ этот класс Π±Ρ‹Π» ΠΏΡ€ΠΈΠΌΠ΅Π½Ρ‘Π½ Π² Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΊΠΎΠΌΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€Π°, Π½Π°Π΄ΠΎ ввСсти ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½Ρ‹ΠΉ Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ класс, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈ Π±ΡƒΠ΄Π΅Ρ‚ наслСдником классов с Π΄Π°Π½Π½Ρ‹ΠΌΠΈ. ΠŸΡ€ΠΈ этом ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ класс с Π΄Π°Π½Π½Ρ‹ΠΌΠΈ Π±ΡƒΠ΄Π΅Ρ‚ снабТён своим ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΌ индСксом:

Π§Ρ‚ΠΎΠ±Ρ‹ Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡŒ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ ΠΊΠΎΠΌΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€Π°, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ Π²Ρ‹Π·ΠΎΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. Для удобства Π΅Π³ΠΎ опрСдСлСния сначала опрСдСляСтся Ρ‚ΠΈΠΏ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ³ΠΎ значСния:

Для опрСдСлСния Ρ‚ΠΈΠΏΠ° Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ³ΠΎ значСния ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ другая новая для C++ конструкция β€” decltype. Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠΌ Π΅Ρ‘ примСнСния (Π² Π΄Π°Π½Π½ΠΎΠΌ случаС) являСтся Ρ‚ΠΈΠΏ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ³ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ значСния. ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡ выглядит нСсколько странной. По смыслу ΠΎΠ½Π° эквивалСнтна Ρ‚Π°ΠΊΠΎΠΉ:

Но ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π² области видимости класса ΠΏΠ°ΠΊΠ΅Ρ‚ fs Π½Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½, Ρ‚ΠΎ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ примСняСтся ΠΊ сконвСртированному ΠΊ ссылкС Π½Π° Ρ‚ΠΈΠΏ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ nullptr.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ всё Π³ΠΎΡ‚ΠΎΠ²ΠΎ для опрСдСлСния ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° Π²Ρ‹Π·ΠΎΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ классы, хранящиС ΡƒΡ‡Π°ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ Π² ΠΊΠΎΠΌΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Π² качСствС ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ· ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² шаблона ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‚ цСлочислСнный индСкс, Ρ‚ΠΎ этот ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ рСализуСтся Ρ‡Π΅Ρ€Π΅Π· Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, Π² ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ пСрСдаётся всё Ρ‚ΠΎΡ‚ ΠΆΠ΅ цСлочислСнный ΠΊΠΎΡ€Ρ‚Π΅ΠΆ:

ΠžΡΡ‚Π°Π»ΠΎΡΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, ΠΎΠ±Π»Π΅Π³Ρ‡Π°ΡŽΡ‰ΡƒΡŽ созданиС экзСмпляров этого класса:

ΠΈ ΠΊΠΎΠΌΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ Π³ΠΎΡ‚ΠΎΠ². ΠŸΠ°Ρ€Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ² Π΅Π³ΠΎ использования:

ПолноС ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ шаблонного класса-ΠΊΠΎΠΌΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€Π° выглядит Ρ‚Π°ΠΊ:

Π’Π°ΠΊΠΆΠ΅ этот класс ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ Π±Ρ‹ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π½Π° Π±Π°Π·Π΅ ΠΊΠΎΡ€Ρ‚Π΅ΠΆΠ΅ΠΉ ΠΈΠ· STL (std::tuple). Π’ этом случаС Π² классС DataHolder Π½Π΅ Π±Ρ‹Π»ΠΎ Π±Ρ‹ нСобходимости. Π‘ использованиСм std::tuple рСализация ΠΊΠΎΠΌΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€Π° Π±ΡƒΠ΄Π΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ:

Π’Π°ΠΊΠΎΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ выглядит нСсколько ΠΏΡ€ΠΎΡ‰Π΅.

Π•Ρ‰Ρ‘ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ количСство хитростСй

РаскрытиС ΠΏΠ°ΠΊΠ΅Ρ‚Π° ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² Π² контСкстС «список ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈΒ» прСдоставляСт программисту достаточно Π±ΠΎΠ»ΡŒΡˆΡƒΡŽ свободу дСйствий, Ρ‚. ΠΊ. Π² этом случаС ΠΏΠ°Ρ‚Ρ‚Π΅Ρ€Π½ΠΎΠΌ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΠΎΠ»Π½ΠΎΡ†Π΅Π½Π½ΠΎΠ΅ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅. НапримСр, сумму ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½Ρ‹Ρ… Π² качСствС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² чисСл ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ Ρ‚Π°ΠΊ:

Во ТС в связкС с constexpr:

ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ, Π΅ΡΡ‚ΡŒ Π»ΠΈ срСди ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½Ρ‹Ρ… чисСл ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ β€” Ρ‚Π°ΠΊ:

ΠŸΡ€ΠΈ использовании Ρ‚Π°ΠΊΠΎΠ³ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° нСльзя Π·Π°Π±Ρ‹Π²Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ вычислСний Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ², ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Π΅ΠΌΡ‹Ρ… Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, строго говоря, Π½Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π°, ΠΈ Π² ΠΊΠ°ΠΊΠΎΠΌ ΠΈΠΌΠ΅Π½Π½ΠΎ порядкС Π±ΡƒΠ΄ΡƒΡ‚ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½Ρ‹ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ β€” Π·Π°Ρ€Π°Π½Π΅Π΅ ΡΠΊΠ°Π·Π°Ρ‚ΡŒ нСльзя.

Подводя ΠΈΡ‚ΠΎΠ³, ΠΌΠΎΠΆΠ½ΠΎ ΡΠΊΠ°Π·Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΡˆΠ°Π±Π»ΠΎΠ½Ρ‹ с ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌ количСством ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² β€” ΠΎΡ‡Π΅Π½ΡŒ ΠΌΠΎΡ‰Π½ΠΎΠ΅ срСдство, ΠΏΠΎΡΠ²Π»ΡΡŽΡ‰Π΅Π΅ΡΡ Π² языкС C++. Они Π»ΠΈΡˆΠ΅Π½Ρ‹ ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½Ρ‹Ρ… нСдостатков ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… сСйчас списков Ρ‚ΠΈΠΏΠΎΠ² (ΠΈΠ»ΠΈ ΠΈΠ½Ρ‹Ρ… эмуляций ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠ³ΠΎ повСдСния), ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ нСбольшим ΠΎΠ±ΡŠΡ‘ΠΌΠΎΠΌ ΠΊΠΎΠ΄Π° Π²Ρ‹Ρ€Π°ΠΆΠ°Ρ‚ΡŒ достаточно слоТныС ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΠΈ. ΠŸΡ€ΠΈΠ²Π΅Π΄Ρ‘Π½Π½Ρ‹Π΅ Π² этой ΡΡ‚Π°Ρ‚ΡŒΠ΅ конструкции ΠΌΠΎΠΆΠ½ΠΎ ΡΡ€Π°Π²Π½ΠΈΡ‚ΡŒ с Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½Ρ‹ΠΌΠΈ, Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½Π½Ρ‹ΠΌΠΈ Π² Ρ€Π°ΠΌΠΊΠ°Ρ… Π΄Π΅ΠΉΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ стандарта (для этого ΠΌΠΎΠΆΠ½ΠΎ Π·Π°Π³Π»ΡΠ½ΡƒΡ‚ΡŒ Π² исходныС Ρ„Π°ΠΉΠ»Ρ‹ boost::bind, boost::function, boost::tuple). Но ΠΎΠ½ΠΈ Π½Π΅ Π»ΠΈΡˆΠ΅Π½Ρ‹ ΠΈ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… нСдостатков. Π“Π»Π°Π²Π½Ρ‹ΠΉ ΠΈΠ· Π½ΠΈΡ… β€” ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½ΠΎΠ΅ число контСкстов, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΏΠ°ΠΊΠ΅Ρ‚Ρ‹ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² ΠΌΠΎΠ³ΡƒΡ‚ Ρ€Π°ΡΠΊΡ€Ρ‹Π²Π°Ρ‚ΡŒΡΡ. Π’ частности, ΠΏΠ°ΠΊΠ΅Ρ‚Ρ‹ Π½Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Ρ€Π°ΡΠΊΡ€Ρ‹Π²Π°Ρ‚ΡŒΡΡ Π² выраТСния, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ρ‚Π°ΠΊ:

К элСмСнтам ΠΏΠ°ΠΊΠ΅Ρ‚Π° нСльзя ΠΎΠ±Ρ€Π°Ρ‰Π°Ρ‚ΡŒΡΡ ΠΏΠΎ индСксу.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ

Π¨Π°Π±Π»ΠΎΠ½Ρ‹ с ΠΌΠ½ΠΎΠ³ΠΎΡ‚ΠΎΡ‡ΠΈΠ΅ΠΌ ΠΈ Variadic

Π¨Π°Π±Π»ΠΎΠ½ Variadic β€” это класс ΠΈΠ»ΠΈ шаблон Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‰ΠΈΠΉ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½ΠΎΠ΅ число Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ². Π­Ρ‚ΠΎΡ‚ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ особСнно ΡƒΠ΄ΠΎΠ±Π΅Π½ для Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ C++, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π΅Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΊ ΠΊΠ°ΠΊ ΠΊ шаблонам классов, Ρ‚Π°ΠΊ ΠΈ ΠΊ шаблонам Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΎΠ½ прСдоставляСт ΡˆΠΈΡ€ΠΎΠΊΠΈΠΉ спСктр ΡˆΠΈΡ€ΠΎΠΊΠΈΠΉ спСктр типобСзопасных ΠΈ Π½Π΅Ρ‚Ρ€ΠΈΠ²ΠΈΠ°Π»ΡŒΠ½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΈ Π³ΠΈΠ±ΠΊΠΈΡ… возмоТностСй.

Бинтаксис

Π’ ΡˆΠ°Π±Π»ΠΎΠ½Π°Ρ… шаблонами с ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌ числом Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² ΠΌΠ½ΠΎΠ³ΠΎΡ‚ΠΎΡ‡ΠΈΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ двумя способами. Π‘Π»Π΅Π²Π° ΠΎΡ‚ ΠΈΠΌΠ΅Π½ΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° обозначаСтся ΠΏΠ°ΠΊΠ΅Ρ‚ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ², Π° справа ΠΎΡ‚ ΠΈΠΌΠ΅Π½ΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° β€” ΠΏΠ°ΠΊΠ΅Ρ‚Ρ‹ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² Ρ€Π°Π·Π²ΠΎΡ€Π°Ρ‡ΠΈΠ²Π°ΡŽΡ‚ΡΡ Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΈΠΌΠ΅Π½Π°.

НиТС ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ простой ΠΏΡ€ΠΈΠΌΠ΅Ρ€ синтаксиса опрСдСлСния класса шаблона Variadic :

Π’ ΠΎΠ±ΠΎΠΈΡ… случаях (ΠΊΠ°ΠΊ ΠΏΡ€ΠΈ Π²Π²Π΅Π΄Π΅Π½ΠΈΠΈ ΠΏΠ°ΠΊΠ΅Ρ‚Π° ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ², Ρ‚Π°ΠΊ ΠΈ ΠΏΡ€ΠΈ Π΅Π³ΠΎ Ρ€Π°Π·Π²Π΅Ρ€Ρ‚Ρ‹Π²Π°Π½ΠΈΠΈ) Π²ΠΎΠΊΡ€ΡƒΠ³ многоточия ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ±Π΅Π»ΡŒΠ½Ρ‹Π΅ символы, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π² этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅:

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ Π² этой ΡΡ‚Π°Ρ‚ΡŒΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ соглашСниС, ΠΏΠΎΠΊΠ°Π·Π°Π½Π½ΠΎΠ΅ Π² ΠΏΠ΅Ρ€Π²ΠΎΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ (ΠΌΠ½ΠΎΠ³ΠΎΡ‚ΠΎΡ‡ΠΈΠ΅ присоСдиняСтся ΠΊ typename ).

Π’ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΡ… ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°Ρ… Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠΌ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ². Класс classname ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠ΅ число Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ², ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°Ρ…:

ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ шаблонного класса с ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌ числом Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² ΠΌΠΎΠΆΠ΅Ρ‚ ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒ Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅Π΄Π°Π½ ΠΏΠΎ мСньшСй ΠΌΠ΅Ρ€Π΅ ΠΎΠ΄ΠΈΠ½ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€:

НиТС ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ простой ΠΏΡ€ΠΈΠΌΠ΅Ρ€ синтаксиса Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ шаблона Variadic :

Π—Π°Ρ‚Π΅ΠΌ ΠΏΠ°ΠΊΠ΅Ρ‚ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² arguments разворачиваСтся для использования, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ Ρ€Π°Π·Π΄Π΅Π»Π΅ ΠžΠ±Ρ‰ΠΈΠ΅ свСдСния ΠΎ ΡˆΠ°Π±Π»ΠΎΠ½Π°Ρ… Variadic.

Π’ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹ ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Ρ„ΠΎΡ€ΠΌΡ‹ синтаксиса шаблонной Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ с ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌ количСством Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹. НСкоторыС ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Ρ‹ Π½ΠΈΠΆΠ΅.

const Π’Π°ΠΊΠΆΠ΅ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½Ρ‹ спСцификаторы:

Π¨Π°Π±Π»ΠΎΠ½Π½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ с ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌ числом Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² (ΠΊΠ°ΠΊ ΠΈ Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½Ρ‹Π΅ ΡˆΠ°Π±Π»ΠΎΠ½Π½Ρ‹Π΅ классы) Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠ³ΡƒΡ‚ ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒ Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅Π΄Π°Π½ ΠΏΠΎ мСньшСй ΠΌΠ΅Ρ€Π΅ ΠΎΠ΄ΠΈΠ½ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€.

Π’ ΡˆΠ°Π±Π»ΠΎΠ½Π°Ρ… с ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌ числом Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ sizeof. () (ΠΎΠ½ Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΡ ΠΊ старому ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρƒ sizeof() ).

Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ свСдСния ΠΎ ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ многоточия

Π’Ρ‹ΡˆΠ΅ Π² этой ΡΡ‚Π°Ρ‚ΡŒΠ΅ Π³ΠΎΠ²ΠΎΡ€ΠΈΠ»ΠΎΡΡŒ, Ρ‡Ρ‚ΠΎ Ссли ΠΌΠ½ΠΎΠ³ΠΎΡ‚ΠΎΡ‡ΠΈΠ΅ опрСдСляСт ΠΏΠ°ΠΊΠ΅Ρ‚Ρ‹ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² ΠΈ ΠΈΡ… Ρ€Π°Π·Π²Π΅Ρ€Ρ‚Ρ‹Π²Π°Π½ΠΈΠ΅, Ρ‚ΠΎ «Π‘Π»Π΅Π²Π° ΠΎΡ‚ ΠΈΠΌΠ΅Π½ΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° ΠΎΠ½ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ ΠΏΠ°ΠΊΠ΅Ρ‚ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ², Π° справа ΠΎΡ‚ ΠΈΠΌΠ΅Π½ΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° ΠΎΠ½ΠΎ слуТит для развСртывания ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ² ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΈΠΌΠ΅Π½Π°». ВСхничСски это Π²Π΅Ρ€Π½ΠΎ, Π½ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΡ€ΠΎΠΆΠ΄Π°Ρ‚ΡŒ нСоднозначности ΠΏΡ€ΠΈ трансляции Π² ΠΊΠΎΠ΄. ΠŸΡ€ΠΈ этом Π½ΡƒΠΆΠ½ΠΎ ΡƒΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒ ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹Π΅ Π½ΠΈΠΆΠ΅ особСнности.

Π’ шаблонС-parameter-list ( template

) typename. прСдставляСт ΠΏΠ°ΠΊΠ΅Ρ‚ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² шаблона.

Π’ ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠΈ «ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€-объявлСниС» ( func(parameter-list) ) ΠΌΠ½ΠΎΠ³ΠΎΡ‚ΠΎΡ‡ΠΈΠ΅ «Π²Π΅Ρ€Ρ…Π½Π΅Π³ΠΎ уровня» прСдставляСт ΠΏΠ°ΠΊΠ΅Ρ‚ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Π° располоТСниС многоточия ΠΈΠΌΠ΅Π΅Ρ‚ Π²Π°ΠΆΠ½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅:

Π’Π°ΠΌ, Π³Π΄Π΅ ΠΌΠ½ΠΎΠ³ΠΎΡ‚ΠΎΡ‡ΠΈΠ΅ стоит нСпосрСдствСнно Π·Π° ΠΈΠΌΠ΅Π½Π΅ΠΌ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°, ΠΎΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для развСртывания ΠΏΠ°ΠΊΠ΅Ρ‚Π° ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ².

ΠŸΡ€ΠΈΠΌΠ΅Ρ€

ΠœΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ дСйствия ΡˆΠ°Π±Π»ΠΎΠ½Π½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ с ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌ числом Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΎΠΈΠ»Π»ΡŽΡΡ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π½Π° ΠΏΠΎΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ β€” ΠΏΠ΅Ρ€Π΅ΠΏΠΈΡΠ°Ρ‚ΡŒ с Π΅Π΅ использованиСм ΠΊΠ°ΠΊΡƒΡŽ-Π»ΠΈΠ±ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ printf :

Π’Ρ‹Ρ…ΠΎΠ΄Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅

Π‘ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΉ, Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‰ΠΈΡ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ шаблонов Variadic, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ Ρ€Π΅ΠΊΡƒΡ€ΡΠΈΡŽ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Ρ„ΠΎΡ€ΠΌΡ‹, Π½ΠΎ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ отличаСтся ΠΎΡ‚ Ρ‚Ρ€Π°Π΄ΠΈΡ†ΠΈΠΎΠ½Π½ΠΎΠΉ рСкурсии. Врадиционная рСкурсия Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰ΡƒΡŽ саму сСбя, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Ρ‚Ρƒ ΠΆΠ΅ сигнатуру. (Она ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠΆΠ΅Π½Π° ΠΈΠ»ΠΈ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½Π° Π² шаблон, Π½ΠΎ ΠΎΠ΄Π½Π° ΠΈ Ρ‚Π° ΠΆΠ΅ подпись выбираСтся ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π·.) РСкурсия Variadic Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Π²Ρ‹Π·ΠΎΠ²Π΅ шаблона Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Variadic с использованиСм ΠΎΡ‚Π»ΠΈΡ‡Π°ΡŽΡ‰ΠΈΡ…ΡΡ (ΠΏΠΎΡ‡Ρ‚ΠΈ всСгда ΡƒΠΌΠ΅Π½ΡŒΡˆΠ°ΡŽΡ‰ΠΈΡ…ΡΡ) чисСл Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² ΠΈ, Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π· ΠΎΡ‚ΠΌΠ΅Ρ‡Π°Ρ‚ΡŒ Ρ€Π°Π·Π½Ρ‹Π΅ сигнатуры. «Π‘Π°Π·ΠΎΠ²Ρ‹ΠΉ случай» ΠΏΠΎ-ΠΏΡ€Π΅ΠΆΠ½Π΅ΠΌΡƒ являСтся ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ, Π½ΠΎ ΠΏΡ€ΠΈΡ€ΠΎΠ΄Π° рСкурсии отличаСтся.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ

Π¨Π°Π±Π»ΠΎΠ½Ρ‹ с ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌ числом ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ²

ΠšΡƒΠ²ΡˆΠΈΠ½ΠΎΠ² Π”.Π .

Π’Π²Π΅Π΄Π΅Π½ΠΈΠ΅

Начиная с вСрсии C++11 язык C++ прСдоставляСт Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ ΡˆΠ°Π±Π»ΠΎΠ½Ρ‹, ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‰ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠ΅ число ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ².

НапримСр, ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, которая ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½ΠΎΠ΅ число ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ² ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΈΡ… сумму. Если суммированиС для ΠΊΠ°ΠΊΠΎΠΉ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ ΠΏΠ°Ρ€Ρ‹ Ρ‚ΠΈΠΏΠΎΠ² Π½Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΎ, Ρ‚ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ ΠΎΡˆΠΈΠ±ΠΊΡƒ компиляции.

ΠŸΠΎΡ‡Π΅ΠΌΡƒ Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Π²Ρ‹ΡˆΠ΅ для ΠΎΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΠΈ Π²Ρ‹Ρ…ΠΎΠ΄Π° ΠΈΠ· рСкурсии ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ sum, ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‰ΠΈΠΉ ΠΎΠ΄ΠΈΠ½ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€, Π° Π½Π΅ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ sum, ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‰ΠΈΠΉ Π½ΡƒΠ»ΡŒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‰ΠΈΠΉ число Π½ΡƒΠ»ΡŒ?

Π˜Ρ‚Π°ΠΊ, для опрСдСлСния шаблона с ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌ числом ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ ΠΏΠ°ΠΊΠ΅Ρ‚ Ρ‚ΠΈΠΏΠΎΠ² Π² template-Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ΅:

Π’ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠΈ с ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΌΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌΠΈ (ΠΊΠ°ΠΊ Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ с суммой), Π½ΠΎ допустим максимум ΠΎΠ΄ΠΈΠ½ ΠΏΠ°ΠΊΠ΅Ρ‚. ΠŸΠ°ΠΊΠ΅Ρ‚ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ пустым. Π£Π·Π½Π°Ρ‚ΡŒ Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΏΠ°ΠΊΠ΅Ρ‚Π° ΠΌΠΎΠΆΠ½ΠΎ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ sizeof… (имя ΠΏΠ°ΠΊΠ΅Ρ‚Π°).

Types ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π² спискС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ:

Π’Π΅ΠΏΠ΅Ρ€ΡŒ parameters β€” это ΠΏΠ°ΠΊΠ΅Ρ‚ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ², Ρ‚ΠΈΠΏΡ‹ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π·Π°Π΄Π°ΡŽΡ‚ΡΡ β€œΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½Ρ‹ΠΌβ€ ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠΌ Types. ΠŸΠ°ΠΊΠ΅Ρ‚ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ-шаблонС, ΠΈ Π΅ΠΌΡƒ обязан ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠ°ΠΊΠ΅Ρ‚ Ρ‚ΠΈΠΏΠΎΠ².

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 1: суммированиС Ρ†Π΅Π»Ρ‹Ρ… чисСл Π²ΠΎ врСмя компиляции

Рассмотрим ΠΏΡ€ΠΎΡΡ‚Π΅Π½ΡŒΠΊΠΈΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ шаблона шаблона класса с ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌ числом ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ². На этот Ρ€Π°Π· ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ шаблона Π½Π΅ Π±ΡƒΠ΄ΡƒΡ‚ Ρ‚ΠΈΠΏΠ°ΠΌΠΈ, Π° Π±ΡƒΠ΄ΡƒΡ‚ значСниями Ρ‚ΠΈΠΏΠ° size_t.

ΠŸΠΎΡ…ΠΎΠΆΠΈΠΉ ΠΊΠΎΠ΄ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Π½Π° ΠΊΠ°ΠΊΠΎΠΌ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠΌ языкС программирования, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Haskell:

Π—Π°Ρ‡Π΅ΠΌ сразу Ρ‚Ρ€ΠΈ опрСдСлСния?

Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ компилятору, Ρ‡Ρ‚ΠΎ Ρƒ нас Π΅ΡΡ‚ΡŒ ΡˆΠ°Π±Π»ΠΎΠ½Π½Ρ‹ΠΉ класс Sum, ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌΠΈ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ являСтся ΠΏΠ°ΠΊΠ΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Ρ‚ΠΈΠΏΠ° size_t.

являСтся спСциализациСй шаблона Sum для случая пустого ΠΏΠ°ΠΊΠ΅Ρ‚Π° ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ². Π’ этом случаС ΠΌΡ‹ опрСдСляСм Π²Π»ΠΎΠΆΠ΅Π½Π½ΡƒΡŽ константу value со Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ 0 (enum ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для краткости записи).

Ρ‚Π°ΠΊΠΆΠ΅ являСтся спСциализациСй шаблона Sum, Π½ΠΎ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ для случая наличия хотя Π±Ρ‹ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° (first). ΠžΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ΡΠΎΠ±ΠΈΡ€Π°ΡŽΡ‚ΡΡ Π² ΠΏΠ°ΠΊΠ΅Ρ‚ other, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ пуст. Π­Ρ‚ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ позволяСт собствСнно β€œΠ·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒβ€ рСкурсивный процСсс вычислСния суммы. Π Π°Π½ΠΎ ΠΈΠ»ΠΈ ΠΏΠΎΠ·Π΄Π½ΠΎ other окаТСтся пустым ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠΌ ΠΈ Π±ΡƒΠ΄Π΅Ρ‚ подставлСн Π½ΡƒΠ»ΡŒ, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½Ρ‹ΠΉ Π² ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΉ спСциализации.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ прСдставим, Ρ‡Ρ‚ΠΎ трСбуСтся ΡƒΠΌΠ΅Ρ‚ΡŒ Π²Ρ‹Ρ‡ΠΈΡΠ»ΡΡ‚ΡŒ суммарный Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½ΠΎΠ³ΠΎ Π½Π°Π±ΠΎΡ€Π° Ρ‚ΠΈΠΏΠΎΠ² β€” сумму Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ sizeof для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ°. На основС Sum ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Π½ΠΎΠ²Ρ‹ΠΉ шаблон Sum_sizeof:

ΠŸΡ€ΠΈ использовании C++14 (шаблонов ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…) ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅ΠΏΠΈΡΠ°Ρ‚ΡŒ вСсь ΠΊΠΎΠ΄ Π²Ρ‹ΡˆΠ΅ Π±ΠΎΠ»Π΅Π΅ ΠΊΡ€Π°Ρ‚ΠΊΠΎ:

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 2: println

ΠžΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠΌ Π΄Π²Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ: print, Π²Ρ‹Π²ΠΎΠ΄ΡΡ‰ΡƒΡŽ подряд всС свои ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ Π² cout, ΠΈ println, ΠΏΠ΅Ρ€Π΅Π°Π΄Ρ€Π΅ΡΡƒΡŽΡ‰ΡƒΡŽ Π²Ρ‹Π·ΠΎΠ² print ΠΈ Π·Π°Ρ‚Π΅ΠΌ ΠΏΠ΅Ρ‡Π°Ρ‚Π°ΡŽΡ‰ΡƒΡŽ символ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Π° строки. Π¨Π°Π±Π»ΠΎΠ½Ρ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Π² C++ нСльзя ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ частично (ΠΊΠ°ΠΊ классы), Π½ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠΆΠ°Ρ‚ΡŒ. ΠŸΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ компилятор Π΄ΠΎΠ»ΠΆΠ΅Π½ Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΉ ΠΈΠ· подходящих Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠ².

Π’ Π΄Π°Π½Π½ΠΎΠΉ вСрсии ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΉ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ ΠΊΠΎΠΏΠΈΡ€ΡƒΡŽΡ‚ΡΡ (ΠΏΠ΅Ρ€Π΅Π΄Π°ΡŽΡ‚ΡΡ ΠΏΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ), Ρ‡Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π½Π΅ΠΎΠΏΡ‚ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΌ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ΠΌ ΠΏΡ€ΠΈ Π²Ρ‹Π²ΠΎΠ΄Π΅ Π½Π° ΠΏΠ΅Ρ‡Π°Ρ‚ΡŒ строк ΠΈΠ»ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΡ… Π±ΠΎΠ»ΡŒΡˆΠΈΡ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ². ΠŸΠ΅Ρ€Π΅Π΄Π°Ρ‡Ρƒ ΠΏΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ Π² Π΄Π°Π½Π½ΠΎΠΌ случаС ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π΅ΠΉ ΠΏΠΎ const-ссылкС (Π·Π½Π°ΠΊ & Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΡ‚ΠΎΡΡ‚ΡŒ Π΄ΠΎ многоточия).

ΠŸΠΎΠΏΡ€ΠΎΠ±ΡƒΠ΅ΠΌ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΎΠ±ΠΎΠ±Ρ‰ΠΈΡ‚ΡŒ Π΄Π°Π½Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ β€” Ρ€Π°Π·Ρ€Π΅ΡˆΠΈΠΌ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΏΠΎΡ‚ΠΎΠΊΠ° Π²Ρ‹Π²ΠΎΠ΄Π° ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ. Если ΠΎΠ½ Π½Π΅ ΡƒΠΊΠ°Π·Π°Π½, Ρ‚ΠΎ Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ΡŒ Π² cout.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 3: format

ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Π΅ΡΡ‚ΡŒ Π½Π°Π±ΠΎΡ€ Ρ„Π°ΠΉΠ»ΠΎΠ², ΠΎΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‰ΠΈΡ… строки интСрфСйса Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ прилоТСния Π½Π° Ρ€Π°Π·Π½Ρ‹Ρ… языках. НапримСр, английском ΠΈ русском:

ΠœΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ Ρ„Ρ€Π°Π·Ρ‹, подставляя Π² ΠΌΠΎΠ΄Π΅Π»ΡŒΠ½ΡƒΡŽ Ρ„Ρ€Π°Π·Ρƒ-шаблон ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹Π΅ слова ΠΈΠ»ΠΈ значСния. ΠžΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠΌ для этого Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ format, ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‰ΡƒΡŽ ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ β€œΠΌΠΎΠ΄Π΅Π»ΡŒβ€, Π° ΠΏΡ€ΠΎΡ‡ΠΈΠΌΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌΠΈ значСния для подстановки ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‰ΡƒΡŽ строку. ΠŸΡƒΡΡ‚ΡŒ Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, строки ΠΈΠ· Ρ„Π°ΠΉΠ»Π° Π±Ρ‹Π»ΠΈ считаны Π² Π²Π΅ΠΊΡ‚ΠΎΡ€ строк phrase, Ρ‚ΠΎΠ³Π΄Π°

даст β€œIntensity may take values between 0 and 1.” Π² случаС Π²Ρ‹Π±ΠΎΡ€Π° английского Ρ„Π°ΠΉΠ»Π° ΠΈ β€œΠΠ°ΡΡ‹Ρ‰Π΅Π½Π½ΠΎΡΡ‚ΡŒ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ значСния ΠΌΠ΅ΠΆΠ΄Ρƒ 0 ΠΈ 1.” Π² случаС Π²Ρ‹Π±ΠΎΡ€Π° русского Ρ„Π°ΠΉΠ»Π°. А

даст, соотвСтствСнно β€œoil price forecasting” ΠΈ β€œΠΏΡ€ΠΎΠ³Π½ΠΎΠ· Ρ†Π΅Π½Ρ‹ для нСфти” (ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Ρ€Π°Π·Π½ΠΎΠ³ΠΎ порядка подстановок).

ΠŸΠΎΠΏΡ€ΠΎΠ±ΡƒΠ΅ΠΌ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ format с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π‘Ρ‚Π°Π½Π΄Π°Ρ€Ρ‚Π½ΠΎΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ C++ ΠΈ шаблонов с ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌ числом ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ².

Если ΠΏΠΎΠΏΡ‹Ρ‚Π°Ρ‚ΡŒΡΡ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Π΅Ρ‘ рСкурсивно Π² стилС print ΠΈΠ· ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅Π³ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°, Ρ‚ΠΎ придётся ΠΏΠΎΠ΄ΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ ΠΏΠΎ ΠΎΠ΄Π½ΠΎΠΉ строкС ΠΈ ΠΎΡ€Π³Π°Π½ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ подсчёт Π½ΠΎΠΌΠ΅Ρ€Π° Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ подстановки, Ρ‚. Π΅. понадобятся Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ опрСдСлСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‰Π΅ΠΉ Π½ΠΎΠΌΠ΅Ρ€. Π—Π΄Π΅ΡΡŒ рассмотрим Π΄Ρ€ΡƒΠ³ΠΎΠΉ способ, Π° ΠΈΠΌΠ΅Π½Π½ΠΎ, созданиС массива строковых прСдставлСний ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ².

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π½Π΅Ρ‚ рСкурсии, ΠΈ Π½Π΅ΡˆΠ°Π±Π»ΠΎΠ½Π½Ρ‹ΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ format ΡƒΠΆΠ΅ Π½Π΅ Π½ΡƒΠΆΠ΅Π½. ΠœΡ‹ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅ΠΌ массив строк param строками, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹ΠΌΠΈ для Π½ΠΈΡ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ to_string. (ΠžΡΡ‚ΠΎΡ€ΠΎΠΆΠ½ΠΎ: to_string Π½Π΅ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ string! Π‘ этим разбСрёмся Π΄Π°Π»Π΅Π΅.). ΠŸΡƒΡΡ‚Π°Ρ строка Π² Π½Π°Ρ‡Π°Π»Π΅ позволяСт Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ массив param Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ ΠΏΠΎ ΠΊΡ€Π°ΠΉΠ½Π΅ΠΉ ΠΌΠ΅Ρ€Π΅ 1 элСмСнт (массивы Ρ€Π°Π·ΠΌΠ΅Ρ€Π° 0 Π·Π°ΠΏΡ€Π΅Ρ‰Π΅Π½Ρ‹).

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹-строки Π½Π΅ Π²Ρ‹Π·Ρ‹Π²Π°Π»ΠΈ ошибки компиляции, создадим свою Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ to_str ΠΈ Π±ΡƒΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΅Ρ‘ вмСсто to_string:

Π Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ format (собствСнно Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ подстановки) ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎ-Ρ€Π°Π·Π½ΠΎΠΌΡƒ. НапримСр, β€œΠ² лоб” Π½Π° основС рукописного ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠ³ΠΎ Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚Π° Ρ‚Π°ΠΊ:

Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ рСгулярныС выраТСния ( #include ) ΠΈΠ· Π‘Ρ‚Π°Π½Π΄Π°Ρ€Ρ‚Π½ΠΎΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ, ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΏΠΎΡ…ΠΎΠΆΠΈΠΉ ΠΊΠΎΠ΄ Π±ΠΎΠ»Π΅Π΅ ΠΊΡ€Π°Ρ‚ΠΊΠΎ:

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 4: список Ρ‚ΠΈΠΏΠΎΠ²

Бписок Ρ‚ΠΈΠΏΠΎΠ² type list β€” конструкция Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ компиляции, Π·Π°Π΄Π°ΡŽΡ‰Π°Ρ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ (β€œΡΠΏΠΈΡΠΎΠΊβ€) ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ² ΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰Π°Ρ ΠΎΠΏΠ΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ этой ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒΡŽ ΠΊΠ°ΠΊ Π΅Π΄ΠΈΠ½Ρ‹ΠΌ Ρ†Π΅Π»Ρ‹ΠΌ.

Начнём с ΠΏΡ€ΠΎΡΡ‚Π΅ΠΉΡˆΠ΅Π³ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°. ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ ΠΏΠΎΠ΄ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ, сколько Ρ€Π°Π· встрСчаСтся Π·Π°Π΄Π°Π½Π½Ρ‹ΠΉ Ρ‚ΠΈΠΏ Π² ΠΏΠ°ΠΊΠ΅Ρ‚Π΅. Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Ρ‚Π°ΠΊ (C++14):

Π—Π΄Π΅ΡΡŒ, ΠΎΠ΄Π½Π°ΠΊΠΎ, нСльзя Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ΡŒ ΠΎ спискС Ρ‚ΠΈΠΏΠΎΠ² Types, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΏΠ°ΠΊΠ΅Ρ‚ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² шаблона Π½Π΅ являСтся Ρ‚ΠΈΠΏΠΎΠΌ, ΠΈ возмоТности Π΅Π³ΠΎ использования довольно ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Ρ‹. Π’ΠΏΡ€ΠΎΡ‡Π΅ΠΌ, благодаря ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΡƒ частичной спСциализации шаблонов с подстановкой ΠΏΠΎ ΠΎΠ±Ρ€Π°Π·Ρ†Ρƒ, Π»Π΅Π³ΠΊΠΎ ΡΠ²ΡΠ·Π°Ρ‚ΡŒ ΠΏΠ°ΠΊΠ΅Ρ‚ с ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΌ Ρ‚ΠΈΠΏΠΎΠΌ. Для этого ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠΌ шаблон Type_list (ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠ³ Π±Ρ‹ вовсС Π½Π΅ ΠΈΠΌΠ΅Ρ‚ΡŒ Ρ‡Π»Π΅Π½ΠΎΠ²):

ПослС этого ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠ΄ Π²Ρ‹Π²Π΅Π΄Π΅Ρ‚ 0 2 :

Помимо подсчёта числа Π²Ρ…ΠΎΠΆΠ΄Π΅Π½ΠΈΠΉ ΠΌΠΎΠΆΠ½ΠΎ Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½ΠΎ Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎ Ρ‡Π΅Ρ€Π΅Π· рСкурсивноС ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ поиск ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ вхоТдСния (индСкс):

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Ρ‡Ρ‚ΠΎ Π½Π°Π΄ΠΎ, Π½Π°ΠΎΠ±ΠΎΡ€ΠΎΡ‚, ΠΏΠΎ Π½ΠΎΠΌΠ΅Ρ€Ρƒ Π² спискС Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ ΠΈΠ· Π½Π΅Π³ΠΎ Ρ‚ΠΈΠΏ. Π­Ρ‚ΠΎ Ρ‚ΠΎΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ рСкурсивно, Π½ΠΎ ΡƒΠΆΠ΅ Π½Π΅ ΠΊΠ°ΠΊ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ, Π° ΠΊΠ°ΠΊ Ρ‚ΠΈΠΏ. ΠžΠ±Ρ‹Ρ‡Π½ΠΎ это дСлаСтся Ρ‡Π΅Ρ€Π΅Π· ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ структуры с Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹ΠΌ Ρ‚ΠΈΠΏΠΎΠΌ type, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅.

Π’ Π‘Ρ‚Π°Π½Π΄Π°Ρ€Ρ‚Π½ΠΎΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅ (Π² ) Π΅ΡΡ‚ΡŒ мноТСство ΠΏΠΎΡ…ΠΎΠΆΠΈΡ… ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΉ, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΠΈΡ… Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ ряд манипуляций с Ρ‚ΠΈΠΏΠ°ΠΌΠΈ.

ΠœΠ΅Ρ‚Π°Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ называСтся ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π² мноТСство Ρ‚ΠΈΠΏΠΎΠ² ΠΈΠ»ΠΈ ΠΈΠ· мноТСства Ρ‚ΠΈΠΏΠΎΠ².

ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΠΈ Π²Ρ€ΠΎΠ΄Π΅ t_at, t_at_t ΠΈΠ»ΠΈ Π΄Π°ΠΆΠ΅ t_index Π²Ρ‹ΡˆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ мСтафункциями, Π½ΠΎ синтаксичСски Π·Π°Ρ‚Ρ€ΡƒΠ΄Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΡ… сами Π² качСствС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΌΠ΅Ρ‚Π°Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, Ρ‡Ρ‚ΠΎ ослабляСт ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ‚ΠΈΠ²Π½ΡƒΡŽ ΠΌΠΎΡ‰Π½ΠΎΡΡ‚ΡŒ ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹Ρ… конструкций.

β€œΠŸΠΎΠ»Π½ΠΎΡ†Π΅Π½Π½ΠΎΠΉβ€ ΠΌΠ΅Ρ‚Π°Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ Π² синтаксисС C++ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°Π·Π²Π°Ρ‚ΡŒ Π½Π΅ΡˆΠ°Π±Π»ΠΎΠ½Π½Ρ‹ΠΉ класс, ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΠΉ Π²Π»ΠΎΠΆΠ΅Π½Π½ΠΎΠ΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ шаблона Ρ‚ΠΈΠΏΠ°, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΡƒΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠ°ΠΊ t_at. Π­Ρ‚ΠΎ позволяСт ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒ ΠΌΠ΅Ρ‚Π°Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΊΠ°ΠΊ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΉ Ρ‚ΠΈΠΏ.

ΠœΠ΅Ρ‚Π°Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ Π²Ρ‹ΡΡˆΠ΅Π³ΠΎ порядка называСтся мСтафункция, ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‰Π°Ρ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΌΠ΅Ρ‚Π°Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΊΠ°ΠΊ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹.

НапримСр, ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠΌ ΠΌΠ΅Ρ‚Π°Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ добавлСния элСмСнта Π² Π½Π°Ρ‡Π°Π»ΠΎ списка Ρ‚ΠΈΠΏΠΎΠ².

НСдостаток этой конструкции ΠΎΡ‡Π΅Π²ΠΈΠ΄Π΅Π½: ΡƒΠΆ ΠΎΡ‡Π΅Π½ΡŒ Π½Π°Π²ΠΎΡ€ΠΎΡ‡Π΅Π½Π½ΠΎ выглядит β€œΠ²Ρ‹Π·ΠΎΠ²β€ ΠΌΠ΅Ρ‚Π°Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ:

Π’ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ΅, ΠΊ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ опрСдСляСмой ΠΌΠ΅Ρ‚Π°Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΌΠΎΠΆΠ½ΠΎ Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎΠ΅ ΠΏΠ°Ρ€Π½ΠΎΠ΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ синонима Ρ‚ΠΈΠΏΠ° Ρ‡Π΅Ρ€Π΅Π· using, Π½ΠΎ Ссли мСтафункция ΠΏΡ€ΠΈΡˆΠ»Π° ΠΊΠ°ΠΊ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€, Ρ‚ΠΎ ΠΌΡ‹ Π½Π΅ Π·Π½Π°Π΅ΠΌ Π΅Ρ‘ имя ΠΈ Π±ΡƒΠ΄Π΅ΠΌ Π²Ρ‹Π½ΡƒΠΆΠ΄Π΅Π½Ρ‹ ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΏΠΎΠ»Π½Ρ‹ΠΉ синтаксис примСнСния.

Π”Ρ€ΡƒΠ³ΠΎΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ состоит Π² ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ макроса, Ρ€Π°ΡΠΊΡ€Ρ‹Π²Π°ΡŽΡ‰Π΅Π³ΠΎΡΡ Π² эту ΠΈΠ΄ΠΈΠΎΠΌΠ°Ρ‚ΠΈΡ‡Π΅ΡΠΊΡƒΡŽ ΠΊΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡŽ:

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ слоТныС конструкции с мСньшим синтаксичСским ΡˆΡƒΠΌΠΎΠΌ. НапримСр, рСкурсивноС ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΌΠ΅Ρ‚Π°Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π²Ρ‹ΡΡˆΠ΅Π³ΠΎ порядка T_map, ΠΏΠΎΡ€ΠΎΠΆΠ΄Π°ΡŽΡ‰Π΅ΠΉ список Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ² для Π·Π°Π΄Π°Π½Π½ΠΎΠΉ ΠΌΠ΅Ρ‚Π°Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Map (β€œΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅β€) ΠΈ списка Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ²:

МоТно Π»ΠΈ T_map Π·Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ ΠΊΡ€Π°Ρ‚ΠΊΠΎ Π±Π΅Π· рСкурсии?

ΠžΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠΌ Π΅Ρ‰Ρ‘ ΠΎΠ΄Π½Ρƒ ΠΌΠ΅Ρ‚Π°Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Π²Ρ‹ΡΡˆΠ΅Π³ΠΎ порядка β€” свёртку (fold). ΠŸΡ€ΠΈΠΌΠ΅Ρ€ свёрток: сумма элСмСнтов, ΠΏΡ€ΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½ΠΈΠ΅ элСмСнтов, максимум, ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌ ΠΈ Ρ‚.ΠΏ. АргумСнтами свёртки ΡΠ²Π»ΡΡŽΡ‚ΡΡ ассоциативная бинарная опСрация ΠΈ список.

Π’ случаС, Ссли Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ ΠΌΠ΅Ρ‚Π°Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ значСниями, Π° Π½Π΅ Ρ‚ΠΈΠΏΠ°ΠΌΠΈ (Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ Ρ‚ΠΈΠΏΠΈΡ‡Π½Ρ‹Π΅ случаи: булСвскиС ΠΈ цСлочислСнныС константы), Ρ‚ΠΎ ΠΈΡ… ΡƒΠ΄ΠΎΠ±Π½ΠΎ β€œΠΎΠ±Π΅Ρ€Π½ΡƒΡ‚ΡŒβ€ Π² Ρ‚ΠΈΠΏ ΠΈ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ Π΄Π°Π»Π΅Π΅ ΠΊΠ°ΠΊ Ρ‚ΠΈΠΏΡ‹. НапримСр, для цСлочислСнных констант ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ Π±Ρ‹ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΎΠ±Ρ‘Ρ€Ρ‚ΠΊΡƒ Π²Ρ€ΠΎΠ΄Π΅

Π’ΠΏΡ€ΠΎΡ‡Π΅ΠΌ, Π² Π‘Ρ‚Π°Π½Π΄Π°Ρ€Ρ‚Π½ΠΎΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅ ΡƒΠΆΠ΅ Π΅ΡΡ‚ΡŒ Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½Ρ‹ΠΉ шаблон integral_constant, ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ β€” Ρ‚ΠΈΠΏ константы, Π²Ρ‚ΠΎΡ€ΠΎΠΉ β€” сама константа.

ΠžΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ β€œΠΌΠ°ΠΊΡΠΈΠΌΡƒΠΌβ€, ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‰ΡƒΡŽ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ integral_constant:

ΠžΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ T_sizeof, ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΡŽΡ‰ΡƒΡŽ Ρ‚ΠΈΠΏ Π² Π΅Π³ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€ (Π² Π²ΠΈΠ΄Π΅ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ integral_constant).

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π½Π°ΠΉΡ‚ΠΈ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ Ρ€Π°Π·ΠΌΠ΅Ρ€ Ρ‚ΠΈΠΏΠ° ΠΈΠ· Π·Π°Π΄Π°Π½Π½ΠΎΠ³ΠΎ списка:

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 5: Variant

Π’ наслСдство ΠΎΡ‚ C языку C++ достался ряд Π½ΠΈΠ·ΠΊΠΎΡƒΡ€ΠΎΠ²Π½Π΅Π²Ρ‹Ρ… срСдств. Одним ΠΈΠ· Ρ‚Π°ΠΊΠΈΡ… срСдств являСтся β€œΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅β€ (union) β€” Π½Π°Π±ΠΎΡ€ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ, Ρ€Π°Π·ΠΌΠ΅Ρ‰Ρ‘Π½Π½Ρ‹Ρ… ΠΏΠΎ ΠΎΠ΄Π½ΠΎΠΌΡƒ адрСсу Π² памяти.

ОбъСдинСниС Π½ΠΈΠΊΠ°ΠΊ Π½Π΅ Ρ€Π΅ΡˆΠ°Π΅Ρ‚ вопрос опрСдСлСния Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊΠΎΠ΅ ΠΈΠΌΠ΅Π½Π½ΠΎ ΠΏΠΎΠ»Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π² Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚. Однако Π² C++ ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ шаблон, ΡΠ²Π»ΡΡŽΡ‰ΠΈΠΉΡΡ типобСзопасным Π°Π½Π°Π»ΠΎΠ³ΠΎΠΌ объСдинСния β€” Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π½Ρ‹ΠΉ Ρ‚ΠΈΠΏ. ΠžΠ±ΡŠΠ΅ΠΊΡ‚ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° Π² ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Ρ…Ρ€Π°Π½ΠΈΡ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ· Π·Π°Π΄Π°Π½Π½Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ² (ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ шаблона) ΠΈ β€œΠ·Π½Π°Π΅Ρ‚β€, ΠΊΠ°ΠΊΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ хранится Π² Π½Ρ‘ΠΌ Π² Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚.

ΠŸΠΎΠ·Π°ΠΈΠΌΡΡ‚Π²ΡƒΠ΅ΠΌ Ρ‡Π°ΡΡ‚ΡŒ ΠΊΠΎΠ΄Π° ΠΈΠ· ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅Π³ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° (список Ρ‚ΠΈΠΏΠΎΠ²).

Π—Π΄Π΅ΡΡŒ для простоты ΠΌΠ΅Ρ‚Π°Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π²Ρ‹ΡΡˆΠ΅Π³ΠΎ порядка ΠΎΠ±Ρ‰Π΅Π³ΠΎ Π²ΠΈΠ΄Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π½Π΅ Π±ΡƒΠ΄Π΅ΠΌ: вычислСниС максимума sizeof ΠΈ alignof Π±ΡƒΠ΄Π΅ΠΌ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ рСкурсивных ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΉ шаблонов ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ….

МоТно Π»ΠΈ Π·Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ эти опрСдСлСния Π±ΠΎΠ»Π΅Π΅ ΠΊΡ€Π°Ρ‚ΠΊΠΎ ΠΈ Π±Π΅Π· рСкурсии?

ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° β€œΡΠ²Π»ΡΠ΅Ρ‚ΡΡ Π»ΠΈ список 1 подмноТСством списка 2” (ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚ΠΈΡ‡Π½Ρ‹ΠΉ рСкурсивный Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ компиляции):

Π’ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Π°Ρ конструкция: Π½Π°ΠΉΡ‚ΠΈ Π² спискС Ρ‚ΠΈΠΏΠΎΠ² ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ Ρ‚ΠΈΠΏ (Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ Π΅Π³ΠΎ Π½ΠΎΠΌΠ΅Ρ€), для ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½ конструктор, ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‰ΠΈΠΉ Π·Π°Π΄Π°Π½Π½Ρ‹ΠΉ Π½Π°Π±ΠΎΡ€ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² Args. Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ –1, Ссли Ρ‚Π°ΠΊΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° Π² спискС Π½Π΅Ρ‚:

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π΅ΡΡ‚ΡŒ достаточно Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΉ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΡΡ‚Π΅Π½ΡŒΠΊΡƒΡŽ Π²Π΅Ρ€ΡΠΈΡŽ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ°. (Π‘ΠΎΠ»Π΅Π΅ ΠΏΡ€ΠΎΠ΄Π²ΠΈΠ½ΡƒΡ‚Ρ‹ΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚, ΠΊ Ρ‚ΠΎΠΌΡƒ ΠΆΠ΅ Π½Π΅ Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‰ΠΈΠΉ C++14, Π΅ΡΡ‚ΡŒ Π² ΠΏΠ°ΠΊΠ΅Ρ‚Π΅ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ Boost, Π°Π½Π°Π»ΠΎΠ³ планируСтся Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ Π² Π‘Ρ‚Π°Π½Π΄Π°Ρ€Ρ‚Π½ΡƒΡŽ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ C++17.)

ΠŸΠ°ΠΊΠ΅Ρ‚ Types (ΠΈ ΠΎΡ‚Π²Π΅Ρ‡Π°ΡŽΡ‰ΠΈΠΉ Π΅ΠΌΡƒ список Ρ‚ΠΈΠΏΠΎΠ² types) содСрТит Ρ‚ΠΈΠΏΡ‹, значСния ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΌΠΎΠ³ΡƒΡ‚ хранится Π² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π΅ Variant. ΠŸΠΎΡ‚Ρ€Π΅Π±ΡƒΠ΅ΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΡ… Π±Ρ‹Π»ΠΎ Π½Π΅ мСньшС 0, Π½ΠΎ ΠΈ Π½Π΅ большС 63 (Π² ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ΅, тСкущая рСализация допускаСт Π΄ΠΎ 255 Ρ‚ΠΈΠΏΠΎΠ²).

ΠŸΠ°ΠΌΡΡ‚ΡŒ выдСляСтся статичСски Π² Π²ΠΈΠ΄Π΅ Π½Π΅ΠΊΠΎΠ΅Π³ΠΎ β€œΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°β€ (просто кусок памяти Π½ΡƒΠΆΠ½ΠΎΠ³ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° с Π½ΡƒΠΆΠ½Ρ‹ΠΌ Π²Ρ‹Ρ€Π°Π²Π½ΠΈΠ²Π°Π½ΠΈΠ΅ΠΌ) _stor. НомСр Ρ‚ΠΈΠΏΠ° Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ значСния хранится Π² ΠΏΠΎΠ»Π΅ _type. Для β€œΠ½Π΅ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ…β€ Variant это –1, Ρ‚.Π΅. Π½ΠΈΠΊΠ°ΠΊΠΎΠ³ΠΎ значСния Π½Π΅Ρ‚. Π’Π°ΠΊΠΈΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Variant Π±ΡƒΠ΄Π΅ΠΌ Π½Π°Π·Ρ‹Π²Π°Ρ‚ΡŒ пустыми.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ прСдставим, Ρ‡Ρ‚ΠΎ Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΡƒΠ½ΠΈΡ‡Ρ‚ΠΎΠΆΠΈΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, хранящССся Π² Variant. Π˜Π½Ρ‹ΠΌΠΈ словами, Π½Π°Π΄ΠΎ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ дСструктор для Ρ‚ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ°, Π½ΠΎΠΌΠ΅Ρ€ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ записан Π² ΠΏΠΎΠ»Π΅ _type. Π­Ρ‚ΠΎ Π»Π΅Π³ΠΊΠΎ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ, Ссли ΠΎΠ±Π΅Ρ€Π½ΡƒΡ‚ΡŒ Π²Ρ‹Π·ΠΎΠ²Ρ‹ дСструкторов для всСх Types Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ с ΠΎΠ±Ρ‰ΠΈΠΌ интСрфСйсом, ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠΆΠ½ΠΎ просто ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ Π² массивС ΠΈ Π²Ρ‹Π±ΠΈΡ€Π°Ρ‚ΡŒ ΠΈΡ…, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ _type Π² качСствС индСкса.

Для ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ/присваивания ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Variant Π΄Π°Π½Π½Ρ‹ΠΉ Ρ‚Ρ€ΡŽΠΊ нСслоТно ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΠΈΡ‚ΡŒ. Π§Ρ‚ΠΎΠ±Ρ‹ Π½Π΅ ΡƒΡΠ»ΠΎΠΆΠ½ΡΡ‚ΡŒ ΠΊΠΎΠ΄, Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅ΠΌ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ Ρ€Π°Π±ΠΎΡ‡ΠΈΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ Π½Π° основС конструктора копирования.

МоТно ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Ρ‚Π°ΠΊΠΆΠ΅ ΡƒΠ½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½Ρ‹ΠΉ конструктор, ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‰ΠΈΠΉ любой Π½Π°Π±ΠΎΡ€ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² ΠΈ ΠΏΡ‹Ρ‚Π°ΡŽΡ‰ΠΈΠΉΡΡ ΠΏΠΎΠ΄ΠΎΠ±Ρ€Π°Ρ‚ΡŒ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ Ρ‚ΠΈΠΏ ΠΈΠ· списка, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ допускаСт ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ Ρ‚Π°ΠΊΠΈΠΌ Π½Π°Π±ΠΎΡ€ΠΎΠΌ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ². Π•ΠΌΡƒ Π½Π΅ Π½ΡƒΠΆΠ½Π° Ρ‚Π°Π±Π»ΠΈΡ†Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ-ΠΎΠ±Ρ‘Ρ€Ρ‚ΠΎΠΊ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ½ Π²Ρ‹Π±ΠΈΡ€Π°Π΅Ρ‚ Π½ΡƒΠΆΠ½Ρ‹ΠΉ Ρ‚ΠΈΠΏ статичСски.

НаконСц, ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ присваивания ΠΎΠ΄Π½ΠΎΠΉ спСциализации Variant значСния Π΄Ρ€ΡƒΠ³ΠΎΠΉ спСциализации Variant. Для этого Π½Π°ΠΌ понадобится Ρ‚Π°Π±Π»ΠΈΡ†Π° ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Π° Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ _type:

УдовлСтворяСт Π»ΠΈ наш класс Variant ΠΏΡ€Π°Π²ΠΈΠ»Ρƒ пяти?

ΠŸΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹ΠΌΠΈ ΠΏΠΎΠ»ΠΈΠΌΠΎΡ€Ρ„Π½Ρ‹ΠΌΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΡƒΠ΄ΠΎΠ±Π½ΠΎ ΡΠΎΡΡ‚Ρ‹ΠΊΠΎΠ²Π°Ρ‚ΡŒ ΠΈΡ… с встроСнными срСдствами C++ RTTI (run-time type information). Π’ частности, ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΠ·Π²Π»Π΅Ρ‡Π΅Π½ΠΈΠ΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° typeid для Ρ…Ρ€Π°Π½ΠΈΠΌΠΎΠ³ΠΎ Π² Variant значСния. Π­Ρ‚ΠΎ ΠΎΠΏΡΡ‚ΡŒ ΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π·Π°Ρ€Π°Π½Π΅Π΅ созданной Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹.

Для простоты кодирования Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹ΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Ρ„ΡƒΠ½ΠΊΡ‚ΠΎΡ€Π°-посСтитСля отбрасываСтся.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ

Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ

Π’Π°Ρˆ адрСс email Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Π½. ΠžΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ поля ΠΏΠΎΠΌΠ΅Ρ‡Π΅Π½Ρ‹ *