Skip to content

agaltsevstas/Templates

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

15 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

Template

Π¨Π°Π±Π»ΠΎΠ½ β€” ΠΏΠ°Ρ‚Ρ‚Π΅Ρ€Π½ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ создаСт классы ΠΈΠ»ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ². Π¨Π°Π±Π»ΠΎΠ½ - это лишь ΠΌΠ°ΠΊΠ΅Ρ‚, ΠΏΠΎ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ гСнСрируСтся ΠΊΠΎΠ΄ Π²ΠΎ врСмя компиляции. ΠŸΡ€ΠΈ Π²ΠΈΠ΄Π΅ Ρ‚Π°ΠΊΠΎΠΉ конструкции: my_swap<T> компилятор сам создаст Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ my_swap с Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹ΠΌ Ρ‚ΠΈΠΏΠΎΠΌ. Π­Ρ‚ΠΎ называСтся инстанцированиС шаблона. Π’ΠΎ Π΅ΡΡ‚ΡŒ ΠΏΡ€ΠΈ Π²ΠΈΠ΄Π΅ my_swap<int> компилятор создаст Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ my_swap Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ T помСняСт Π½Π° int, Π° ΠΏΡ€ΠΈ Π²ΠΈΠ΄Π΅ my_swap<double> Π±ΡƒΠ΄Π΅Ρ‚ создана функция с Ρ‚ΠΈΠΏΠΎΠΌ double. Если Π³Π΄Π΅-Ρ‚ΠΎ дальшС компилятор ΠΎΠΏΡΡ‚ΡŒ встрСтит my_swap<int>, Ρ‚ΠΎ ΠΎΠ½ Π½ΠΈΡ‡Π΅Π³ΠΎ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚, Ρ‚.ΠΊ. ΠΊΠΎΠ΄ Π΄Π°Π½Π½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΡƒΠΆΠ΅ Π΅ΡΡ‚ΡŒ (шаблон с Π΄Π°Π½Π½Ρ‹ΠΌ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ ΡƒΠΆΠ΅ инстанцирован). Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ссли ΠΌΡ‹ инстанцируСм этот шаблон 2 Ρ€Π°Π·Π° с Ρ€Π°Π·Π½Ρ‹ΠΌΠΈ Ρ‚ΠΈΠΏΠ°ΠΌΠΈ, Ρ‚ΠΎ компилятор создаст 2 Ρ€Π°Π·Π½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.
Π¨Π°Π±Π»ΠΎΠ½ β€” ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ‚ ΡΡΠΊΠΎΠ½ΠΎΠΌΠΈΡ‚ΡŒ врСмя выполнСния (rutime) засчСт Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ компиляции (compile), Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, constexpr, ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ минимальноС ΠΊΠΎΠ»-Π²ΠΎ ΠΊΠΎΠ΄Π°.

4 Ρ‚ΠΈΠΏΠ° шаблонов

  • ΡˆΠ°Π±Π»ΠΎΠ½Ρ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ: template<typename T> T max(T &a, T &b) { return a > b ? a : b; }
  • ΡˆΠ°Π±Π»ΠΎΠ½Ρ‹ классов: template<class T> class { T t; };
  • ΡˆΠ°Π±Π»ΠΎΠ½Ρ‹ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…: template<typename T> constexpr T pi = T{3.141592653589793238462643383L};
  • Non-type ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹: template<class T, size_t N> class array;. Non-type template parameter (ΡˆΠ°Π±Π»ΠΎΠ½Π½Ρ‹Π΅ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ Π½Π΅ ΡΠ²Π»ΡΡŽΡ‰ΠΈΠ΅ΡΡ Ρ‚ΠΈΠΏΠ°ΠΌΠΈ) ΠΈΠ»ΠΈ (ΡˆΠ°Π±Π»ΠΎΠ½Π½Ρ‹Π΅ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹-константы) - Π² качСствС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² шаблонов ΠΌΠΎΠ³ΡƒΡ‚ Π²Ρ‹ΡΡ‚ΡƒΠΏΠ°Ρ‚ΡŒ константы Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Π½Π° этапС комплияции. C++14: способ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ non-type template ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ с нСизвСстным Ρ‚ΠΈΠΏΠΎΠΌ Π±Ρ‹Π»Π° ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π° Π΄Π²ΡƒΡ… ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² – Ρ‚ΠΈΠΏΠ° ΠΈ значСния. C++17: ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΈΡΠ°Ρ‚ΡŒ auto для non-type template ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ².

Π¨Π°Π±Π»ΠΎΠ½Ρ‹-Ρ‡Π»Π΅Π½Ρ‹ Π½Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ virtual Π² классах.

ΠŸΠ»ΡŽΡΡ‹:

  • ΠΎΠ±ΠΎΠ±Ρ‰Π΅Π½ΠΈΠ΅ Ρ€Π°Π·Π½Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ² Π΄Π°Π½Π½Ρ‹Ρ…, Ρ‚Π°ΠΊΠΈΡ… ΠΊΠΎΠ½Π΅ΠΉΠ½Π΅Ρ€ΠΎΠ² std::vector, std::map
  • сокращСниС повторСния ΠΊΠΎΠ΄Π°
  • cтатичСский ΠΏΠΎΠ»ΠΈΠΌΠΎΡ€Ρ„ΠΈΠ·ΠΌ - ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠ·ΠΊΠ° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ (SFINAE)
  • Π±ΠΎΠ»Π΅Π΅ бСзопасны Π² использовании (ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° ΠΈΠ΄Π΅Ρ‚ Π²ΠΎ врСмя компиляции)
  • Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ/классах ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒ Π½Π΅ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½ΠΎΠ΅ число Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² (variadic template): template<typename… Args>

ΠœΠΈΠ½ΡƒΡΡ‹:

  • Π·Π°Ρ‚Ρ€ΡƒΠ΄Π½ΡΡŽΡ‚ ΠΎΡ‚Π»Π°Π΄ΠΊΡƒ ΠΊΠΎΠ΄Π°
  • нСясныС ошибки Π²ΠΎ врСмя компиляции
  • ΡƒΠ²Π΅Π»ΠΈΡ‡Π΅Π½ΠΈΠ΅ врСмя компиляции Ρ€Π°Π·ΠΌΠ΅Ρ€Π° скомпилированного Π΄Π²ΠΎΠΈΡ‡Π½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π°, Ссли ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ шаблон Π² .h Ρ„Π°ΠΉΠ»Π΅.

Π˜Π½ΡΡ‚Π°Π½Ρ†ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ шаблона

Π­Ρ‚ΠΎ гСнСрация ΠΊΠΎΠ΄Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈΠ»ΠΈ класса Ρ‡Π΅Ρ€Π΅Π· подстановку ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² Π² шаблон. ΠŸΡ€ΠΈ инстанцировании 3 Ρ€Π°Π·Π½Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ²: int, double, string, компилятор создаСт Ρ‚Ρ€ΠΈ Ρ€Π°Π·Π½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ/классы.

2 Π’ΠΈΠ΄Π° инстанцирования:

1. Implicit Instantiation

НСявноС инстанцированиС - происходит ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈΠ»ΠΈ создании ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° класса (ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Π² .h Ρ„Π°ΠΉΠ»Π°Ρ…)

ΠŸΠ»ΡŽΡΡ‹:

  • Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ явно ΠΈΠ½ΡΡ‚Π°Π½Ρ†ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ всС Ρ‚ΠΈΠΏΡ‹ Π² .cpp Ρ„Π°ΠΉΠ»Π΅
  • Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ явно ΠΈΠ½ΡΡ‚Π°Π½Ρ†ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ всС Ρ‚ΠΈΠΏΡ‹, Ссли шаблон ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½ ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ Π² ΠΎΠ΄Π½ΠΎΠΌ .cpp Ρ„Π°ΠΉΠ»Π΅ Π² Ρ‚ΠΎΠΌ мСстС, Π³Π΄Π΅ ΠΎΠ½ вызываСтся ΠœΠΈΠ½ΡƒΡΡ‹:
  • Π Π°Π·ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠ΅ шаблонов Π² .h Ρ„Π°ΠΉΠ»Π°Ρ… ΠΌΠΎΠΆΠ΅Ρ‚ привСсти ΠΊ Π·Π°Π³Ρ€ΠΎΠΌΠΎΠΆΠ΄Π΅Π½ΠΈΡŽ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° ΠΊΠΎΠ΄Π° ΠΈ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° скомпилированного Π΄Π²ΠΎΠΈΡ‡Π½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π°.

2. Explicit instantiation

Π―Π²Π½ΠΎΠ΅ инстанцированиС - с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ€Π΅Π·Π΅Ρ€Π²ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ слова template (ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Π² .cpp Ρ„Π°ΠΉΠ»Π°Ρ…). КаТдая Π΅Π΄ΠΈΠ½ΠΈΡ†Π° трансляции транслируСтся ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎ, Π° ΠΏΠΎΡ‚ΠΎΠΌ всё линкуСтся. Π˜Π½ΡΡ‚Π°Π½Ρ†ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ шаблонов (подстановка) происходит Π΄ΠΎ Π»ΠΈΠ½ΠΊΠΎΠ²ΠΊΠΈ. ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ‚ΠΎΡ€ ΠΏΡ€ΠΈ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ ΠΊΠΎΠ΄Π° Π΄ΠΎΠ»ΠΆΠ΅Π½ Π²ΠΈΠ΄Π΅Ρ‚ΡŒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ шаблона (Π° Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ объявлСниС), Ρ‚Π°ΠΊ ΠΈ опрСдСлСния Ρ‚ΠΈΠΏΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΎΠ΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‚ΡΡ Π² шаблон. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Ссли класс/функция ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Ρ‹ Π² .h Ρ„Π°ΠΉΠ»Π΅, Π° рСализация Π² .cpp Ρ„Π°ΠΉΠ»Π΅, Ρ‚ΠΎ ΠΏΡ€ΠΈ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ комплияции Π΄Π²ΡƒΡ… .cpp Ρ„Π°ΠΉΠ»ΠΎΠ² компилятор Π½Π΅ Π·Π°ΠΏΠΎΠΌΠ½ΠΈΡ‚ подставляСмый Ρ‚ΠΈΠΏ Π² ΠΎΠ΄Π½ΠΎΠΌ .cpp Ρ„Π°ΠΉΠ»Π°, Π³Π΄Π΅ вызываСтся шаблон, Π²ΠΎ врСмя компиляции Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ .cpp Ρ„Π°ΠΉΠ»Π°, Π³Π΄Π΅ находится рСализация ΠΌΠ΅Ρ‚ΠΎΠ΄Π°/класса. Π’ .cpp Ρ„Π°ΠΉΠ»Π΅, Π³Π΄Π΅ рСализация ΠΌΠ΅Ρ‚ΠΎΠ΄Π°/класса Π½ΡƒΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ явноС инстанцированиС.

ΠŸΠ»ΡŽΡΡ‹:

  • cΠΎΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅ явной Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ класса/ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Π² .cpp Ρ„Π°ΠΉΠ»Π΅
  • ΠΏΡ€Π΅Π΄ΠΎΡ‚Π²Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° (экономит врСмя ΠΈ Ρ€Π°Π·ΠΌΠ΅Ρ€)

ΠœΠΈΠ½ΡƒΡΡ‹:

  • Если Π½Π΅ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ явноС инстанцированиС всСх Ρ‚ΠΈΠΏΠΎΠ² Π² .cpp Ρ„Π°ΠΉΠ»Π΅, Ρ‚ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ошибка: undefined reference
  • Π―Π²Π½ΠΎ инстанцированная шаблонная функция/класс ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ ΠΊΠΎΠΏΠΈΠΈ .cpp Ρ„Π°ΠΉΠ»Π°Ρ…, Ρ‡Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ Ρ‚ΠΎΡ€ΠΌΠΎΠ·ΠΈΡ‚ΡŒ сам процСсс компиляции ΠΈ сборки

Π”ΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅

Π―Π²Π½ΠΎ инстанцированная шаблонная функция/класс ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ ΠΊΠΎΠΏΠΈΠΈ .cpp Ρ„Π°ΠΉΠ»Π°Ρ…, Ρ‡Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ Ρ‚ΠΎΡ€ΠΌΠΎΠ·ΠΈΡ‚ΡŒ сам процСсс компиляции ΠΈ сборки. МоТно ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ явноС объявлСниС инстанциации с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ extern Π² .h Ρ„Π°ΠΉΠ»Π΅ ΠΈ ΠΎΠ΄Π½ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π² .cpp Ρ„Π°ΠΉΠ»Π΅, ΠΈ Ρ‚ΠΎΠ³Π΄Π° компилятору Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠ½ΡΡ‚Π°Π½Ρ†ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ шаблон Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Π΅Π΄ΠΈΠ½ΠΈΡ†Π΅ трансляции, Ρ‡Ρ‚ΠΎ ΡƒΠΌΠ΅Π½ΡŒΡˆΠ°Π΅Ρ‚ врСмя компиляции.

ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ‚ΠΎΡ€ Π² ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Π΅ Π²Ρ‹Π±ΠΈΡ€Π°Π΅Ρ‚ Π±ΠΎΠ»Π΅Π΅ спСцилизированный шаблон

Π‘ΠΏΠ΅Ρ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ шаблонов ΠΏΠΎ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Π°ΠΌ:

  1. Полная спСциализация (explicit (ΠΈΠ»ΠΈ full) specialization) - Π½Π°ΠΏΠΎΠΌΠΈΠ½Π°Π΅Ρ‚ наслСдованиС ΠΈΠ»ΠΈ ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠ·ΠΊΡƒ - template<> class vector, Ρ‚ΠΎΠ³Π΄Π° компилятор Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Π΄ΠΎΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒ класс ΠΏΠΎΠ΄ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΉ Ρ‚ΠΈΠΏ Π΄Π°Π½Π½Ρ‹Ρ…, Π° Π²Ρ‹Π·ΠΎΠ²Π΅Ρ‚ ΡƒΠΆΠ΅ ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½Π½ΡƒΡŽ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ, Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π°ΠΏΡ€Π΅Ρ‚ΠΈΡ‚ΡŒ для ΠΊΠ°ΠΊΠΎΠ³ΠΎ-Ρ‚ΠΎ Ρ‚ΠΈΠΏΠ° ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Π΅ дСйствия ΠΈΠ»ΠΈ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ, Π² ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ²
  2. Частичная спСциализация (partial specialization) - Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для классов template class vector<bool, A>. Для ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² нСльзя, Π½ΠΎ это ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ±ΠΎΠΉΡ‚ΠΈ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π² частичном спСциализированном классС static ΠΌΠ΅Ρ‚ΠΎΠ΄.
  3. Основной шаблон (primary template) - vector

Variadic Template

Π¨Π°Π±Π»ΠΎΠ½ с Π·Π°Ρ€Π°Π½Π΅Π΅ нСизвСстным числом Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ². ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ многоточия ΠΈΠ»ΠΈ элипсис (…), ΠΊΠΎΠ³Π΄Π° ΠΎΠ½ стоит слСва ΠΎΡ‚ ΠΈΠΌΠ΅Π½ΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΎΠ½ ΠΎΠ±ΡŠΡΠ²Π»ΡΠ΅Ρ‚ Π½Π°Π±ΠΎΡ€ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² (template<typename... Args>), ΠΊΠΎΠ³Π΄Π° стоит справа ΠΎΡ‚ шаблона ΠΈΠ»ΠΈ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° Π²Ρ‹Π·ΠΎΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΎΠ½ распаковываСт ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Π΅ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ (Args&... args). НапримСр, std::tuple - ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΈΠ½ΡΡ‚ΡŒ любоС число Π²Ρ…ΠΎΠ΄Π½Ρ‹Ρ… ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ².

Π”ΠΎ C++17: для развёртывания ΠΏΠ°Ρ‡ΠΊΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² трСбуСтся рСкурсивноС инстанциированиС шаблонов с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ stub-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ (Π·Π°Π³Π»ΡƒΡˆΠΊΠ°).

Fold expression

Π’Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ свСртки - шаблон с Π·Π°Ρ€Π°Π½Π΅Π΅ нСизвСстным числом Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² (variadic template). Π‘Π²Π΅Ρ€Ρ‚ΠΊΠ° – это функция, которая примСняСт Π·Π°Π΄Π°Π½Π½ΡƒΡŽ ΠΊΠΎΠΌΠ±ΠΈΠ½ΠΈΡ€ΡƒΡŽΡ‰ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΊ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ ΠΏΠ°Ρ€Π°ΠΌ элСмСнтов Π² спискС ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚. Π›ΡŽΠ±ΠΎΠ΅ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ свёртки Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ Π·Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΎ Π² скобки ΠΈ Π² ΠΎΠ±Ρ‰Π΅ΠΌ Π²ΠΈΠ΄Π΅ выглядит Ρ‚Π°ΠΊ: (Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ содСрТащСС ΠΏΠ°Ρ‡ΠΊΡƒ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ²). Π’Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π²Π½ΡƒΡ‚Ρ€ΠΈ скобок Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ Π² сСбС Π½Π΅Ρ€Π°ΡΠΊΡ€Ρ‹Ρ‚ΡƒΡŽ ΠΏΠ°Ρ‡ΠΊΡƒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² ΠΈ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ²:

+  -  *  /  %  ^  &  |  =  <  >  <<  >>
+=  -=  *=  /=  %=  ^=  &=  |=  <<=  >>=
==  !=  <=  >=  &&  ||  ,  .*  ->*

Template argument deduction

Π‘ΠΏΠΎΡΠΎΠ±Π½ΠΎΡΡ‚ΡŒ шаблоннов ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ Ρ‚ΠΈΠΏ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Π΅ΠΌΡ‹Ρ… Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² Π±Π΅Π· явного указания Ρ‚ΠΈΠΏΠ°: вмСсто foo<...>(...) ΠΌΠΎΠΆΠ½ΠΎ foo(...).

Π”ΠΎ C++17 ΠΏΡ€ΠΈ инстанцировании шаблона Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π½ΡƒΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ явно ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ Ρ‚ΠΈΠΏΡ‹ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹: foo<...>(...).

auto ΠΈΠ»ΠΈ Concept auto

Π‘ΠΎΠΊΡ€Π°Ρ‰Π΅Π½Π½Ρ‹ΠΉ шаблон - шаблонная функция, которая содСрТит auto Π² качСствС Ρ‚ΠΈΠΏΠ° Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° ΠΈΠ»ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‰Π΅Π³ΠΎΡΡ значСния.

ΠŸΠ»ΡŽΡΡ‹:

  • ΡƒΠΏΡ€ΠΎΡ‰Π°Π΅Ρ‚ синтаксис
  • Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ ΠΏΠΈΡΠ°Ρ‚ΡŒ template

ΠœΠΈΠ½ΡƒΡΡ‹:

  • Ссли Π·Π°Π±Ρ‹Ρ‚ΡŒ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ return Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Ρ‚ΠΎ функция станСт void
  • ΠΌΠΎΠΆΠ½ΠΎ Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ Π½Π΅ Ρ‚ΠΎΡ‚ Ρ‚ΠΈΠΏ
    РСшСниС: ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ‚Ρ‹ для Ρ‚ΠΎΡ‡Π½ΠΎΠ³ΠΎ возвращСния Π½ΡƒΠΆΠ½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ°

Non-type template parameter

Π¨Π°Π±Π»ΠΎΠ½Π½Ρ‹Π΅ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ Π½Π΅ ΡΠ²Π»ΡΡŽΡ‰ΠΈΠ΅ΡΡ Ρ‚ΠΈΠΏΠ°ΠΌΠΈ - ΡˆΠ°Π±Π»ΠΎΠ½Π½Ρ‹Π΅ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹-константы, Π² качСствС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² шаблонов ΠΌΠΎΠ³ΡƒΡ‚ Π²Ρ‹ΡΡ‚ΡƒΠΏΠ°Ρ‚ΡŒ константы Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Π½Π° этапС комплияции.
C++14: способ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ non-type template ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ с нСизвСстным Ρ‚ΠΈΠΏΠΎΠΌ Π±Ρ‹Π»Π° ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π° Π΄Π²ΡƒΡ… ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² – Ρ‚ΠΈΠΏΠ° ΠΈ значСния.
C++17: ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΈΡΠ°Ρ‚ΡŒ auto для non-type template ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ².
Π‘++20: ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с вСщСствСнными числами.

forward

std::forward - идСальной ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π° (perfect forwarding).

Бвойства:

  • std::forward Π ΠΠ‘ΠžΠ’ΠΠ•Π’ с T&& с НЕконстантными ссылками
  • std::forward НЕ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ с const T& - для всСх Ρ‚ΠΈΠΏΠΎΠ² ссылок (rvalue, const rvalue, lvalue, const lvalue), Ρ‚.ΠΊ. rvalue(T&&) -> lvalue (T&) Π½Π° основС сТатии ссылок (T&(A&&) = A& // && отбрасываСтся).
  • std::forward НЕ Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ c const&& для lvalue

std::forward ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π’ΠžΠ›Π¬ΠšΠž Π² ΡˆΠ°Π±Π»ΠΎΠ½Π°Ρ…:

template<typename T>
T&& forward(T&& param)
{
    if (is_lvalue_reference<T>::value)
        return param;
    else
        return move(param);
}

Π’ΠΈΠΏ typename T ΠΈΠΌΠ΅Π΅Ρ‚ 2 ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠ·ΠΊΠΈ:

  1. lvalue-ссылка (T = const A& ΠΈΠ»ΠΈ T = A&)
  2. rvalue-ссылка (T = A&&)
    Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ:
  3. БСссылочный Ρ‚ΠΈΠΏ (T = A*) - ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ

ИдСальная ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π° позволяСт ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ-ΠΎΠ±Π΅Ρ€Ρ‚ΠΊΠΈ, Π³Π΄Π΅ lvalue-выраТСния ΠΊΠΎΠΏΠΈΡ€ΡƒΡŽΡ‚ΡΡ (просто возвращаСтся lvalue), Π° rvalue-выраТСния ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π°ΡŽΡ‚ΡΡ (std::move).
ИспользованиС:

class Example
{
   std::string field;
   template <class T>
   Example(T&& x) : field(std::forward<T>(x)) {}
};

Reference collapse

Π‘ΠΆΠ°Ρ‚ΠΈΠ΅ ссылок, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² ΡˆΠ°Π±Π»ΠΎΠ½Π°Ρ… ΠΈ опрСдСляСт ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ (отбрасываСт Π½Π΅ Π½ΡƒΠΆΠ½Ρ‹Π΅ &) ΠΏΡ€ΠΈ появлСнии ссылки Π½Π° ссылку. МСньшСС число (&) - Π²Ρ‹ΠΈΠ³Ρ€Ρ‹Π²Π°Π΅Ρ‚ Ρƒ большСго числа (&&).
ΠŸΡ€ΠΈΠΌΠ΅Ρ€:
T инстанцирован A&&, Ρ‚ΠΎ T&& (A&& &&) = A&& // && отбрасываСтся

ΠŸΡ€Π°Π²ΠΈΠ»Π°:

  1. T&(A&) = A& // & отбрасываСтся
  2. T&&(A&) = A& // && отбрасываСтся
  3. T&(A&&) = A& // && отбрасываСтся
  4. T&&(A&&) = A&& // && отбрасываСтся, Π½ΠΎ Ρ‚ΠΈΠΏ xvalue->lvalue

Π£Π½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½ΠΎΠΉ ссылка - Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ Ρ‚ΠΈΠΏΠ° T&&, Π³Π΄Π΅ T β€” ΡˆΠ°Π±Π»ΠΎΠ½Π½Ρ‹ΠΉ Ρ‚ΠΈΠΏ, ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ ΠΎΠ±Π° Ρ‚ΠΈΠΏΠ° ссылок (A& ΠΈ A&&).
ΠŸΡ€ΠΈΠΌΠ΅Ρ€:

template<typename T> 
function(T&& arg) // arg - lvalue всСгда, Ρ‚.ΠΊ. T&& arg - xvalue, поэтому Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒΡΡ конструктор копирования

ΠžΡ‚Π»ΠΈΡ‡ΠΈΠ΅ std::forward ΠΎΡ‚ std::move:

std::move - ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ lvalue ΠΊ rvalue, std::forward - lvalue просто Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ lvalue, Π° rvalue – Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ std::move(rvalue).

Metafunction

ΠœΠ΅Ρ‚Π°Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡ - это шаблонная (template) структура с constexpr Ρ‡Π»Π΅Π½Π°ΠΌΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Ρ‹Ρ‡ΠΈΡΠ»ΡΡŽΡ‚ΡΡ Π²ΠΎ врСмя компиляции. Бтандартная Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° (STL) придСрТиваСтся соглашСния, Π³Π΄Π΅ Π² мСтафункциях ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ:
Π§Π»Π΅Π½Ρ‹:

  • type - Ρ‚ΠΈΠΏ
  • value - Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‰Π΅Π΅ΡΡ значСния, Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚

Concept

ΠšΠΎΠ½Ρ†Π΅ΠΏΡ‚ (concept) - это имя для ограничСния, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ вмСсто слов class ΠΈΠ»ΠΈ typename Π² конструкции с template.
ΠžΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ β€” это шаблонноС Π±ΡƒΠ»Π΅Π²ΠΎ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅. ΠšΠΎΠ½Ρ†Π΅ΠΏΡ‚Ρ‹ ΡƒΠ»ΡƒΡ‡ΡˆΠ°ΡŽΡ‚ Ρ‡ΠΈΡ‚Π°Π΅ΠΌΠΎΡΡ‚ΡŒ ΠΊΠΎΠ΄Π° ΠΈ ΠΎΠ±Π»Π΅Π³Ρ‡Π°Π΅Ρ‚ поиск ошибок. ΠšΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠ·ΠΊΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, спСциализации шаблонов ΠΈ создания ΠΌΠ΅Ρ‚Π°Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ. ΠšΠΎΠ½Ρ†Π΅ΠΏΡ‚Ρ‹ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΡŽΡ‚ΡΡ быстрСС ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠ³ΠΎ SFINAE (std::enable_if ΠΈ constexpr) ΠΈ условия Π² Π½ΠΈΡ… ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π°ΡΡˆΠΈΡ€ΡΡ‚ΡŒ.
ВСрсия C++20 Π²Π΅Ρ€Π½ΡƒΠ»Π°ΡΡŒ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ ΠΊ Π΄Π²ΡƒΠΌ функциям, Π½ΠΎ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΊΠΎΠ΄ Π½Π°ΠΌΠ½ΠΎΠ³ΠΎ Ρ‡ΠΈΡ‚Π°Π±Π΅Π»ΡŒΠ½Π΅Π΅, Ρ‡Π΅ΠΌ с std::enable_if.
requires - ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠ΅ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅.

using vs typedef

typedef Π½Π΅ позволяСт ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ alias (псСвдоним) для template. Π›ΡƒΡ‡ΡˆΠ΅ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ ΠΎΡ‚ΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ ΠΎΡ‚ typedef ΠΈ ΠΏΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ Π½Π° using

Π Π°Π·Π½ΠΈΡ†Π° шаблонов (templates) ΠΎΡ‚ макросов (macros)

ΠœΠ°ΠΊΡ€ΠΎΡ

ΠœΠ°ΠΊΡ€ΠΎΡ - это ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ прСобразования ΠΊΠΎΠ΄Π° прСпроцСссором Π² тСкст, выполняСмыС Π”Πž ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ этого тСскта компилятору. Π‘ тСкстом ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ прСпроцСссор, для ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° - Π½Π°Π±ΠΎΡ€ символов (Π±ΡƒΠΊΠ², Ρ†ΠΈΡ„Ρ€, Π·Π½Π°ΠΊΠΎΠ² для ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ², ΠΏΡ€ΠΎΠ±Π΅Π»ΠΎΠ², ΠΈ Ρ‚.Π΄.).
#include - ΡƒΠΊΠ°Π·Π°Π½ΠΈΠ΅ "Π²ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ вмСсто макроса вСсь тСкст содСрТащийся Π² Ρ„Π°ΠΉΠ»Π΅"
#define - ΡƒΠΊΠ°Π·Π°Π½ΠΈΠ΅ "встрСчая ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‰ΠΈΠΉ макрос, Π²ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ тСкст ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Π·Π° макросом с Π·Π°ΠΌΠ΅Π½ΠΎΠΉ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Π΅ΠΌΡ‹ΠΌ ΠΏΠΎ мСсту использования тСкстом".

Π¨Π°Π±Π»ΠΎΠ½Ρ‹

Π¨Π°Π±Π»ΠΎΠ½ - компилятор ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ Ρ€Π°Π·Π±ΠΈΡ€Π°Π΅Ρ‚ шаблон, выполняСт ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΡƒ коррСктности Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ Ρ‚ΠΈΠΏΠΎΠ², ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…, подстановок шаблонов, для Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ выполняСт ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΡƒ ΠΏΡ€Π°Π²ΠΈΠ» ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠ·ΠΊΠΈ, ΠΈ Ρ‚.Π΄.

ΠžΡ‚Π»ΠΈΡ‡ΠΈΠ΅

Π¨Π°Π±Π»ΠΎΠ½Ρ‹ ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡Ρ‚ΠΈΡ‚Π΅Π»ΡŒΠ½Π΅Π΅ макросов.

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

Patterns

Π¨Π°Π±Π»ΠΎΠ½Ρ‹ β€” ΠΏΠΎΠΌΠΎΠ³Π°ΡŽΡ‚ ΡΡΠΊΠΎΠ½ΠΎΠΌΠΈΡ‚ΡŒ врСмя выполнСния (rutime) засчСт Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ компиляции (compile), Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, constexpr, ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ минимальноС ΠΊΠΎΠ»-Π²ΠΎ ΠΊΠΎΠ΄Π°.

CRTP

Π‘uriously Recurring Template Pattern - рСкурсивный шаблон: класс Derived наслСдуСтся ΠΎΡ‚ шаблонного класса Base, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰Π΅Π³ΠΎ Derived ΠΊΠ°ΠΊ ΡˆΠ°Π±Π»ΠΎΠ½Π½Ρ‹ΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ T. Π§Π΅Ρ€Π΅Π· ΠΌΠ΅Ρ‚ΠΎΠ΄ Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ класса Base ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄ наслСдуСмого класса Derived, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ статичСский ΠΏΠΎΠ»ΠΈΠΌΠΎΡ€Ρ„ΠΈΠ·ΠΌ вмСсто динамичСского ΠΏΠΎΠ»ΠΈΠΌΠΎΡ€Ρ„ΠΈΠ·ΠΌΠ° (Π±Π΅Π· Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ):
static_cast<T*>(this)->method()

ΠŸΠ»ΡŽΡΡ‹:

  • дСлаСтся Π²ΠΎ врСмя компиляции (compile), Π° Π½Π΅ Π²ΠΎ врСмя исполнСния (runtime)
  • Π½Π΅Ρ‚ Π½Π°ΠΊΠ»Π°Π΄Π½Ρ‹Ρ… расходов Π½Π° созданиС Ρ‚Π°Π±Π»ΠΈΡ† Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ
  • врСмя, Π·Π°Ρ‚Ρ€Π°Ρ‡ΠΈΠ²Π°Π΅ΠΌΠΎΠ΅ Π½Π° Π²Ρ‹Π±ΠΎΡ€ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Π² Ρ‚Π°Π±Π»ΠΈΡ†Π΅ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ

ΠœΠΈΠ½ΡƒΡΡ‹:

  • Ρƒ всСх классов-наслСдников Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Ρ‹ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ Π² Π±Π°Π·ΠΎΠ²ΠΎΠΌ классС

SFINAE

Substitution Failure Is Not An Error - ΠΏΡ€ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠ·ΠΎΠΊ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΎΡˆΠΈΠ±ΠΎΡ‡Π½Ρ‹Π΅ подстановки Π² ΡˆΠ°Π±Π»ΠΎΠ½Ρ‹ Π½Π΅ Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‚ ΠΎΡˆΠΈΠ±ΠΊΡƒ компиляции, Π° ΠΎΡ‚Π±Ρ€Π°ΡΡ‹Π²Π°ΡŽΡ‚ΡΡ ΠΈΠ· списка ΠΊΠ°Π½Π΄ΠΈΠ΄Π°Ρ‚ΠΎΠ² Π½Π° Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΡΡ‰ΡƒΡŽ ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠ·ΠΊΡƒ.

ΠŸΡ€Π°Π²ΠΈΠ»Π°:

  • SFINAE это ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ связано с ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠ·ΠΊΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ
  • это Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΏΡ€ΠΈ автоматичСском Π²Ρ‹Π²ΠΎΠ΄Π΅ Ρ‚ΠΈΠΏΠΎΠ² шаблона (type deduction) ΠΏΠΎ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ
  • Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠ·ΠΊΠΈ ΠΌΠΎΠ³ΡƒΡ‚ ΠΎΡ‚Π±Ρ€Π°ΡΡ‹Π²Π°Ρ‚ΡŒΡΡ Π² Ρ‚ΠΎΠΌ случаС, ΠΊΠΎΠ³Π΄Π° ΠΈΡ… Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΈΠ·-Π·Π° Π²ΠΎΠ·Π½ΠΈΠΊΠ°ΡŽΡ‰Π΅ΠΉ синтаксичСской ошибки, компиляция ΠΏΡ€ΠΈ этом продолТаСтся - Π±Π΅Π· ошибок
  • ΠΎΡ‚Π±Ρ€ΠΎΡΠΈΡ‚ΡŒ ΠΌΠΎΠ³ΡƒΡ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ шаблон
  • SFINAE рассматриваСт Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ошибки Π² Ρ‚Π΅Π»Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π½Π΅ Π±ΡƒΠ΄ΡƒΡ‚ ΠΏΡ€ΠΎΠΏΡƒΡ‰Π΅Π½Ρ‹

Matching

ΠŸΠ°Ρ‚Ρ‚Π΅Ρ€Π½ ΡΠΎΠΏΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΠΉ Ρ‚ΠΈΠΏΡ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒ ΠΊΠ°ΠΊ ΠΎΠ±ΠΎΠ±Ρ‰Π΅Π½ΠΈΠ΅ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° switch-case.

Π‘Π°ΠΉΡ‚Ρ‹:

Π―Π·Ρ‹ΠΊΠΎΠ²Ρ‹Π΅ Π½ΠΎΠ²ΡˆΠ΅ΡΡ‚Π²Π° C++17. Π§Π°ΡΡ‚ΡŒ 1. Π‘Π²Ρ‘Ρ€Ρ‚ΠΊΠ° ΠΈ Π²Ρ‹Π²Π΅Π΄Π΅Π½ΠΈΠ΅
А Π΅ΡΡ‚ΡŒ Π»ΠΈ функция?
Π¨Π°Π±Π»ΠΎΠ½Ρ‹
What are C++ variadic templates and fold expressions?
Why can templates only be implemented in the header file?
C++20 idioms for parameter packs
Explicit template instantiation - when is it used?
ΠŸΠ°Ρ€Π°Π΄ΠΈΠ³ΠΌΡ‹ ООП. ΠŸΠΎΠ»ΠΈΠΌΠΎΡ€Ρ„ΠΈΠ·ΠΌ (статичСский, динамичСский). Π˜Π½ΠΊΠ°ΠΏΡΡƒΠ»ΡΡ†ΠΈΡ. НаслСдованиС. ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ динамичСского ΠΈ статичСского ΠΏΠΎΠ»ΠΈΠΌΠΎΡ€Ρ„ΠΈΠ·ΠΌΠΎΠ²
extern template
metafunction
metafunction
matching