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

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Π―Π·Ρ‹ΠΊ программирования C++. ΠŸΡΡ‚ΠΎΠ΅ ΠΈΠ·Π΄Π°Π½ΠΈΠ΅Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 241

Автор Π‘Ρ‚Π΅Π½Π»ΠΈ Π›ΠΈΠΏΠΏΠΌΠ°Π½

Π“Π»Π°Π²Π° 18 Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ΡΡ ΠΎΡ‡Π΅Π½ΡŒ Π²Π°ΠΆΠ½Ρ‹ΠΌ, Π½ΠΎ нСчасто ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΌ срСдством языка: мноТСствСнным наслСдованиСм. ΠœΠ½ΠΎΠΆΠ΅ΡΡ‚Π²Π΅Π½Π½ΠΎΠ΅ наслСдованиС Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ»Π΅Π·Π½ΠΎ Π² слоТных иСрархиях наслСдования.

Π“Π»Π°Π²Π° 19 посвящСна ряду спСциализированных ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΎΠ² ΠΈ ΠΈΠ½ΡΡ‚Ρ€ΡƒΠΌΠ΅Π½Ρ‚Π°Π»ΡŒΠ½Ρ‹Ρ… срСдств Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ряда спСцифичСских ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ. Π’ этой Π³Π»Π°Π²Π΅ Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°ΡŽΡ‚ΡΡ Ρ‚Π°ΠΊΠΈΠ΅ срСдства, ΠΊΠ°ΠΊ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ возмоТности ΠΏΠΎ Ρ€Π°ΡΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΡŽ памяти; ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° языком Π‘++ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ Ρ‚ΠΈΠΏΠΎΠ² Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ выполнСния (RTTI), ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰Π΅ΠΉ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ фактичСский Ρ‚ΠΈΠΏ выраТСния Π²ΠΎ врСмя выполнСния; Π° Ρ‚Π°ΠΊΠΆΠ΅ способы опрСдСлСния ΠΈ использования ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ Π½Π° Ρ‡Π»Π΅Π½Ρ‹ класса. Π£ΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ Π½Π° Ρ‡Π»Π΅Π½Ρ‹ классов ΠΎΡ‚Π»ΠΈΡ‡Π°ΡŽΡ‚ΡΡ ΠΎΡ‚ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ Π½Π° ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ ΠΈΠ»ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. ΠžΠ±Ρ‹Ρ‡Π½Ρ‹Π΅ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ Ρ€Π°Π·Π»ΠΈΡ‡Π°ΡŽΡ‚ΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π° основании Ρ‚ΠΈΠΏΠ° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΠΈΠ»ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. Π£ΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ Π½Π° Ρ‡Π»Π΅Π½Ρ‹ класса Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Ρ‚Π°ΠΊΠΆΠ΅ ΠΎΡ‚Ρ€Π°ΠΆΠ°Ρ‚ΡŒ класс, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠΈΡ‚ Ρ‡Π»Π΅Π½. Π—Π°Ρ‚Π΅ΠΌ Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°ΡŽΡ‚ΡΡ Ρ‚Ρ€ΠΈ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… составных Ρ‚ΠΈΠΏΠ°: объСдинСния, Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Π΅ ΠΈ Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Π΅ классы. Π“Π»Π°Π²Π° Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ΡΡ ΠΊΡ€Π°Ρ‚ΠΊΠΈΠΌ ΠΎΠ±Π·ΠΎΡ€ΠΎΠΌ срСдств, ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π΄Π΅Π»Π°Π΅Ρ‚ ΠΊΠΎΠ΄ нСпСрСносимым. Бюда относится спСцификатор volatile, Π±ΠΈΡ‚ΠΎΠ²Ρ‹Π΅ поля ΠΈ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΊΠΈ.

Π“Π»Π°Π²Π° 17

Π‘ΠΏΠ΅Ρ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ срСдства Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ

ПослСдний стандарт сущСствСнно ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ» Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΈ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ видимости Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ. Π”Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ, посвящСнная Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅ Ρ‡Π°ΡΡ‚ΡŒ стандарта Π±ΠΎΠ»Π΅Π΅ Ρ‡Π΅ΠΌ ΡƒΠ΄Π²ΠΎΠΈΠ»Π°ΡΡŒ ΠΏΠΎ ΡΡ€Π°Π²Π½Π΅Π½ΠΈΡŽ с ΠΏΡ€Π΅ΠΆΠ½ΠΈΠΌ выпуском стандарта ΠΈ составила ΠΏΠΎΡ‡Ρ‚ΠΈ Π΄Π²Π΅ Ρ‚Ρ€Π΅Ρ‚ΠΈ тСкста Π½ΠΎΠ²ΠΎΠ³ΠΎ стандарта. Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎΠ΅ рассмотрСниС ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ класса Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Π‘++ стало Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹ΠΌ Π² Π΄Π°Π½Π½ΠΎΠΌ ΠΈΠ·Π΄Π°Π½ΠΈΠΈ. Однако Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅ спСциализированных Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅Ρ‡Π½Ρ‹Ρ… срСдства ΡΠ²Π»ΡΡŽΡ‚ΡΡ достаточно ΠΎΠ±Ρ‰ΠΈΠΌΠΈ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Ρ€Π°ΡΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΈΡ… Π² Π΄Π°Π½Π½ΠΎΠΉ ΠΊΠ½ΠΈΠ³Π΅: это ΠΊΠΎΡ€Ρ‚Π΅ΠΆΠΈ, Π½Π°Π±ΠΎΡ€Ρ‹ Π±ΠΈΡ‚ΠΎΠ², Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ случайных чисСл ΠΈ рСгулярныС выраТСния. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, Π±ΡƒΠ΄ΡƒΡ‚ рассмотрСны Ρ‚Π°ΠΊΠΆΠ΅ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Π΅ срСдства Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Π²Π²ΠΎΠ΄Π° ΠΈ Π²Ρ‹Π²ΠΎΠ΄Π°.

17.1. Π’ΠΈΠΏ tuple

Π¨Π°Π±Π»ΠΎΠ½ tuple (ΠΊΠΎΡ€Ρ‚Π΅ΠΆ) ΠΏΠΎΠ΄ΠΎΠ±Π΅Π½ ΡˆΠ°Π±Π»ΠΎΠ½Ρƒ pair (ΠΏΠ°Ρ€Π°) (см. Ρ€Π°Π·Π΄Π΅Π» 11.2.3). Π£ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ экзСмпляра шаблона pair ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ Ρ‡Π»Π΅Π½Ρ‹ Ρ€Π°Π·Π½Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ², Π½ΠΎ ΠΈΡ… всСгда Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π΄Π²Π°. Π§Π»Π΅Π½Ρ‹ экзСмпляров шаблона tuple Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ Ρ€Π°Π·Π½Ρ‹Π΅ Ρ‚ΠΈΠΏΡ‹, Π½ΠΎ количСство ΠΈΡ… ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π»ΡŽΠ±Ρ‹ΠΌ. ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΉ экзСмпляр шаблона tuple ΠΈΠΌΠ΅Π΅Ρ‚ фиксированноС количСство Ρ‡Π»Π΅Π½ΠΎΠ², Π½ΠΎ Π΄Ρ€ΡƒΠ³ΠΎΠΉ экзСмпляр Ρ‚ΠΈΠΏΠ° ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΡ‚Π»ΠΈΡ‡Π°Ρ‚ΡŒΡΡ количСством Ρ‡Π»Π΅Π½ΠΎΠ².

Π’ΠΈΠΏ tuple особСнно ΠΏΠΎΠ»Π΅Π·Π΅Π½, ΠΊΠΎΠ³Π΄Π° Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½ΠΈΡ‚ΡŒ Π½Π΅ΠΊΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Π΅ Π² Π΅Π΄ΠΈΠ½Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, Π½ΠΎ Π½Π΅Ρ‚ ТСлания ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ структуру для ΠΈΡ… хранСния. Бписок ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ, ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅ΠΌΡ‹Ρ… Ρ‚ΠΈΠΏΠΎΠΌ tuple, ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ Π² Ρ‚Π°Π±Π». 17.1. Π’ΠΈΠΏ tuple, наряду с ΡΠΎΠΏΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌΠΈ Π΅ΠΌΡƒ Ρ‚ΠΈΠΏΠ°ΠΌΠΈ ΠΈ функциями, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ Π² Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ΅ tuple.


Π’Π°Π±Π»ΠΈΡ†Π° 17.1. ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ с ΠΊΠΎΡ€Ρ‚Π΅ΠΆΠ°ΠΌΠΈ

tuple<T1, T2, ..., Tn> t; t β€” ΠΊΠΎΡ€Ρ‚Π΅ΠΆ с количСством ΠΈ Ρ‚ΠΈΠΏΠ°ΠΌΠΈ Ρ‡Π»Π΅Π½ΠΎΠ², Π·Π°Π΄Π°Π½Π½Ρ‹ΠΌΠΈ списком T1...Tn. Π§Π»Π΅Π½Ρ‹ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‚ΡΡ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ (см. Ρ€Π°Π·Π΄Π΅Π» 3.3.1) tuple<T1, T2, ..., Tn> t(v1, v2, ..., vn); t β€” ΠΊΠΎΡ€Ρ‚Π΅ΠΆ с Ρ‚ΠΈΠΏΠ°ΠΌΠΈ T1...Tn, ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ‡Π»Π΅Π½ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ инициализируСтся ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ΠΎΠΌ vi. Π­Ρ‚ΠΎΡ‚ конструктор являСтся явным (см. Ρ€Π°Π·Π΄Π΅Π» 7.5.4) make_tuple(v1, v2, ..., vn) Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΊΠΎΡ€Ρ‚Π΅ΠΆ, ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ Π΄Π°Π½Π½Ρ‹ΠΌΠΈ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ΠΎΠ². Π’ΠΈΠΏ ΠΊΠΎΡ€Ρ‚Π΅ΠΆΠ° выводится ΠΈΠ· Ρ‚ΠΈΠΏΠΎΠ² ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ΠΎΠ² t1 == t2 t1 != t2 Π”Π²Π° ΠΊΠΎΡ€Ρ‚Π΅ΠΆΠ° Ρ€Π°Π²Π½Ρ‹, Ссли Ρƒ Π½ΠΈΡ… совпадаСт количСство Ρ‡Π»Π΅Π½ΠΎΠ² ΠΈ каТдая ΠΏΠ°Ρ€Π° Ρ‡Π»Π΅Π½ΠΎΠ² Ρ€Π°Π²Π½Π°. Для сравнСния ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ собствСнный ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ == ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Ρ‡Π»Π΅Π½Π°. Как Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π°ΠΉΠ΄Π΅Π½Ρ‹ Π½Π΅Ρ€Π°Π²Π½Ρ‹Π΅ Ρ‡Π»Π΅Π½Ρ‹, ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ Π½Π΅ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡŽΡ‚ΡΡ t1 опсравн t2 ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ сравнСния ΠΊΠΎΡ€Ρ‚Π΅ΠΆΠ΅ΠΉ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ Π°Π»Ρ„Π°Π²ΠΈΡ‚Π½Ρ‹ΠΉ порядок (см. Ρ€Π°Π·Π΄Π΅Π» 9.2.7). Π£ ΠΊΠΎΡ€Ρ‚Π΅ΠΆΠ΅ΠΉ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΠΎΠ΅ количСство Ρ‡Π»Π΅Π½ΠΎΠ². Π§Π»Π΅Π½Ρ‹ ΠΊΠΎΡ€Ρ‚Π΅ΠΆΠ° t1 ΡΡ€Π°Π²Π½ΠΈΠ²Π°ΡŽΡ‚ΡΡ с ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌΠΈ Ρ‡Π»Π΅Π½Π°ΠΌΠΈ ΠΊΠΎΡ€Ρ‚Π΅ΠΆΠ° t2 ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° < get<i>(t) Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ссылку i-ю ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ-Ρ‡Π»Π΅Π½ ΠΊΠΎΡ€Ρ‚Π΅ΠΆΠ° t; Ссли t β€” это l-Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Ρ‚ΠΎ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ β€” ссылка Π½Π° l-Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅; Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС β€” ссылка Π½Π° r-Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅. ВсС Ρ‡Π»Π΅Π½Ρ‹ ΠΊΠΎΡ€Ρ‚Π΅ΠΆΠ° ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΌΠΈ (public) tuple_size<Ρ‚ΠΈΠΏΠšΠΎΡ€Ρ‚Π΅ΠΆΠ°>::value Π¨Π°Π±Π»ΠΎΠ½ класса, экзСмпляр ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ создан ΠΏΠΎ Ρ‚ΠΈΠΏΡƒ ΠΊΠΎΡ€Ρ‚Π΅ΠΆΠ° ΠΈ ΠΈΠΌΠ΅Π΅Ρ‚ public constexpr static ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ-Ρ‡Π»Π΅Π½ value Ρ‚ΠΈΠΏΠ° size_t, ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‰ΡƒΡŽ количСство Ρ‡Π»Π΅Π½ΠΎΠ² Π² ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠΌ Ρ‚ΠΈΠΏΠ΅ ΠΊΠΎΡ€Ρ‚Π΅ΠΆΠ° tuple_element<i, Ρ‚ΠΈΠΏΠšΠΎΡ€Ρ‚Π΅ΠΆΠ°>::type Π¨Π°Π±Π»ΠΎΠ½ класса, экзСмпляр ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ создан ΠΏΠΎ цСлочислСнной константС ΠΈ Ρ‚ΠΈΠΏΡƒ ΠΊΠΎΡ€Ρ‚Π΅ΠΆΠ°, ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΠΉ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΉ Ρ‡Π»Π΅Π½ type, ΡΠ²Π»ΡΡŽΡ‰ΠΈΠΉΡΡ Ρ‚ΠΈΠΏΠΎΠΌ ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠ³ΠΎ Ρ‡Π»Π΅Π½Π° Π² ΠΊΠΎΡ€Ρ‚Π΅ΠΆΠ΅ ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ°

Π’ΠΈΠΏ tuple ΠΌΠΎΠΆΠ½ΠΎ ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ структурой Π΄Π°Π½Π½Ρ‹Ρ… Π½Π° "ΡΠΊΠΎΡ€ΡƒΡŽ Ρ€ΡƒΠΊΡƒ".

17.1.1. ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΈ инициализация ΠΊΠΎΡ€Ρ‚Π΅ΠΆΠ΅ΠΉ

ΠŸΡ€ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ ΠΊΠΎΡ€Ρ‚Π΅ΠΆΠ° слСдуСт ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ Ρ‚ΠΈΠΏΡ‹ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΈΠ· Π΅Π³ΠΎ Ρ‡Π»Π΅Π½ΠΎΠ²:

tuple<size_t, size_t, size_t> threeD; // всС Ρ‚Ρ€ΠΈ Ρ‡Π»Π΅Π½Π° установлСны Π² 0

tuple<string, vector<double>, int, list<int>>

 someVal("constants", {3.14, 2.718}, 42, {0,1,2,3,4,5});

ΠŸΡ€ΠΈ создании ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΠΊΠΎΡ€Ρ‚Π΅ΠΆΠ° ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π»ΠΈΠ±ΠΎ стандартный конструктор ΠΊΠΎΡ€Ρ‚Π΅ΠΆΠ°, ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ‡Π»Π΅Π½ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ (см. Ρ€Π°Π·Π΄Π΅Π» 3.3.1), Π»ΠΈΠ±ΠΎ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Ρ‡Π»Π΅Π½Π°, ΠΊΠ°ΠΊ ΠΏΡ€ΠΈ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΊΠΎΡ€Ρ‚Π΅ΠΆΠ° someVal. Π­Ρ‚ΠΎΡ‚ конструктор ΠΊΠΎΡ€Ρ‚Π΅ΠΆΠ° являСтся явным (см. Ρ€Π°Π·Π΄Π΅Π» 7.5.4), поэтому слСдуСт ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ прямой синтаксис ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ:

tuple<size_t, size_t, size_t> threeD = {1,2,3}; // ошибка

tuple<size_t, size_t, size_t> threeD{1,2,3};    // ok

Π’ качСствС Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Ρ‹, ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ make_pair() (см. Ρ€Π°Π·Π΄Π΅Π» 11.2.3), ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅Ρ‡Π½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ make_tuple(), ΡΠΎΠ·Π΄Π°ΡŽΡ‰ΡƒΡŽ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΊΠΎΡ€Ρ‚Π΅ΠΆΠ°:

// ΠΊΠΎΡ€Ρ‚Π΅ΠΆ, ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΠΉ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΡŽ прилоТСния ΠΊΠ½ΠΈΠΆΠ½ΠΎΠ³ΠΎ ΠΌΠ°Π³Π°Π·ΠΈΠ½Π°:

// ISBN, ΠΊΠΎΠ»ΠΈΡ‡Π΅ΡΡ‚Π²ΠΎ, Ρ†Π΅Π½Π° ΠΊΠ½ΠΈΠ³ΠΈ

auto item = make_tuple("0-999-78345-X", 3, 20.00);

Подобно Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ make_pair(), функция make_tuple() ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Ρ‚ΠΈΠΏΡ‹, прСдоставляСмыС Π² качСствС ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ΠΎΠ², для Π²Ρ‹Π²ΠΎΠ΄Π° Ρ‚ΠΈΠΏΠ° ΠΊΠΎΡ€Ρ‚Π΅ΠΆΠ°. Π’ Π΄Π°Π½Π½ΠΎΠΌ случаС ΠΊΠΎΡ€Ρ‚Π΅ΠΆ item ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚ΠΈΠΏ tuple<const char*, int, double>.

Доступ ΠΊ Ρ‡Π»Π΅Π½Π°ΠΌ ΠΊΠΎΡ€Ρ‚Π΅ΠΆΠ°

Π’ Ρ‚ΠΈΠΏΠ΅ pair всСгда Π΅ΡΡ‚ΡŒ Π΄Π²Π° Ρ‡Π»Π΅Π½Π°, Ρ‡Ρ‚ΠΎ позволяСт Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅ ΠΏΡ€ΠΈΡΠ²ΠΎΠΈΡ‚ΡŒ ΠΈΠΌ ΠΈΠΌΠ΅Π½Π° first (ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ) ΠΈ second (Π²Ρ‚ΠΎΡ€ΠΎΠΉ). Для Ρ‚ΠΈΠΏΠ° tuple Ρ‚Π°ΠΊΠΎΠ΅ соглашСниС ΠΎΠ± ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½ΠΈΠΈ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Ρƒ Π½Π΅Π³ΠΎ Π½Π΅Ρ‚ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠΉ Π½Π° количСство Ρ‡Π»Π΅Π½ΠΎΠ². Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ Ρ‡Π»Π΅Π½Ρ‹ ΠΎΡΡ‚Π°ΡŽΡ‚ΡΡ бСзымянными. ВмСсто ΠΈΠΌΠ΅Π½ для обращСния ΠΊ Ρ‡Π»Π΅Π½Π°ΠΌ ΠΊΠΎΡ€Ρ‚Π΅ΠΆΠ° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅Ρ‡Π½Ρ‹ΠΉ шаблон Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ get. Π§Ρ‚ΠΎΠ±Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ шаблон get, слСдуСт ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ явный Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ шаблона (см. Ρ€Π°Π·Π΄Π΅Π» 16.2.2), Π·Π°Π΄Π°ΡŽΡ‰ΠΈΠΉ ΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ Ρ‡Π»Π΅Π½Π°, доступ ΠΊ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ прСдстоит ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ. Ѐункция get() ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΊΠΎΡ€Ρ‚Π΅ΠΆΠ° ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ссылку Π½Π° Π΅Π³ΠΎ Π·Π°Π΄Π°Π½Π½Ρ‹ΠΉ Ρ‡Π»Π΅Π½:

auto book = get<0>(item);      // Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ Ρ‡Π»Π΅Π½ item

auto cnt = get<1>(item);       // Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π²Ρ‚ΠΎΡ€ΠΎΠΉ Ρ‡Π»Π΅Π½ item

auto price = get<2>(item)/cnt; // Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ послСдний Ρ‡Π»Π΅Π½ item

get<2>(item) *= 0.8;           // примСняСт 20%-Π½ΡƒΡŽ скидку

Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π² скобках Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ цСлочислСнным константным Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ΠΌ (см. Ρ€Π°Π·Π΄Π΅Π»Π΅ 2.4.4). Как ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ, счСт начинаСтся с 0, Π° Π·Π½Π°Ρ‡ΠΈΡ‚, ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ Ρ‡Π»Π΅Π½ΠΎΠΌ Π±ΡƒΠ΄Π΅Ρ‚ get<0>.

Если подробности Ρ‚ΠΈΠΏΠΎΠ² Π² ΠΊΠΎΡ€Ρ‚Π΅ΠΆΠ΅ нСизвСстны, для выяснСния количСства ΠΈ Ρ‚ΠΈΠΏΠΎΠ² Π΅Π³ΠΎ Ρ‡Π»Π΅Π½ΠΎΠ² ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΄Π²Π° Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… шаблона класса:

typedef decltype(item) trans; // trans - Ρ‚ΠΈΠΏ ΠΊΠΎΡ€Ρ‚Π΅ΠΆΠ° item

// Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ количСство Ρ‡Π»Π΅Π½ΠΎΠ² Π² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π΅ Ρ‚ΠΈΠΏΠ° trans

size_t sz = tuple_size<trans>::value;             // Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ 3

// cnt ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚ΠΎΡ‚ ΠΆΠ΅ Ρ‚ΠΈΠΏ, Ρ‡Ρ‚ΠΎ ΠΈ Π²Ρ‚ΠΎΡ€ΠΎΠΉ Ρ‡Π»Π΅Π½ item

tuple_element<1, trans>::type cnt = get<1>(item); // cnt - это int

Для использования шаблонов tuple_size ΠΈ tuple_element Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π·Π½Π°Ρ‚ΡŒ Ρ‚ΠΈΠΏ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΠΊΠΎΡ€Ρ‚Π΅ΠΆΠ°. Как ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ, ΠΏΡ€ΠΎΡ‰Π΅ всСго ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Ρ‚ΠΈΠΏ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ спСцификатора decltype (см. Ρ€Π°Π·Π΄Π΅Π» 2.5.3). Π—Π΄Π΅ΡΡŒ спСцификатор decltype ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для опрСдСлСния псСвдонима для Ρ‚ΠΈΠΏΠ° ΠΊΠΎΡ€Ρ‚Π΅ΠΆΠ° item, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΏΡ€ΠΈ создании экзСмпляров ΠΎΠ±ΠΎΠΈΡ… шаблонов.

Π¨Π°Π±Π»ΠΎΠ½ tuple_size ΠΎΠ±Π»Π°Π΄Π°Π΅Ρ‚ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΎΠΉ статичСской ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ-Ρ‡Π»Π΅Π½ΠΎΠΌ value, содСрТащСй количСство Ρ‡Π»Π΅Π½ΠΎΠ² Π² ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠΌ ΠΊΠΎΡ€Ρ‚Π΅ΠΆΠ΅. Π¨Π°Π±Π»ΠΎΠ½ tuple_element ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ индСкс, Π° Ρ‚Π°ΠΊΠΆΠ΅ Ρ‚ΠΈΠΏ ΠΊΠΎΡ€Ρ‚Π΅ΠΆΠ°. Он ΠΎΠ±Π»Π°Π΄Π°Π΅Ρ‚ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΌ Ρ‚ΠΈΠΏΠΎΠΌ-Ρ‡Π»Π΅Π½ΠΎΠΌ type, содСрТащим Ρ‚ΠΈΠΏ ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠ³ΠΎ Ρ‡Π»Π΅Π½Π° ΠΊΠΎΡ€Ρ‚Π΅ΠΆΠ° Π·Π°Π΄Π°Π½Π½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ°. Подобно Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ get(), шаблон tuple_element Π²Π΅Π΄Π΅Ρ‚ отсчСт индСксов начиная с нуля.