Π¨Π°Π±Π»ΠΎΠ½ β ΠΏΠ°ΡΡΠ΅ΡΠ½ ΠΊΠΎΡΠΎΡΡΠΉ ΡΠΎΠ·Π΄Π°Π΅Ρ ΠΊΠ»Π°ΡΡΡ ΠΈΠ»ΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ ΡΠ°Π·Π»ΠΈΡΠ½ΡΡ
ΡΠΈΠΏΠΎΠ². Π¨Π°Π±Π»ΠΎΠ½ - ΡΡΠΎ Π»ΠΈΡΡ ΠΌΠ°ΠΊΠ΅Ρ, ΠΏΠΎ ΠΊΠΎΡΠΎΡΠΎΠΌΡ Π³Π΅Π½Π΅ΡΠΈΡΡΠ΅ΡΡΡ ΠΊΠΎΠ΄ Π²ΠΎ Π²ΡΠ΅ΠΌΡ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΈΠΈ. ΠΡΠΈ Π²ΠΈΠ΄Π΅ ΡΠ°ΠΊΠΎΠΉ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΈΠΈ: my_swap<T> ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡ ΡΠ°ΠΌ ΡΠΎΠ·Π΄Π°ΡΡ ΡΡΠ½ΠΊΡΠΈΡ my_swap Ρ Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΡΠΌ ΡΠΈΠΏΠΎΠΌ. ΠΡΠΎ Π½Π°Π·ΡΠ²Π°Π΅ΡΡΡ ΠΈΠ½ΡΡΠ°Π½ΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΡΠ°Π±Π»ΠΎΠ½Π°. Π’ΠΎ Π΅ΡΡΡ ΠΏΡΠΈ Π²ΠΈΠ΄Π΅ my_swap<int> ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡ ΡΠΎΠ·Π΄Π°ΡΡ ΡΡΠ½ΠΊΡΠΈΡ my_swap Π² ΠΊΠΎΡΠΎΡΠΎΠΉ T ΠΏΠΎΠΌΠ΅Π½ΡΠ΅Ρ Π½Π° int, Π° ΠΏΡΠΈ Π²ΠΈΠ΄Π΅ my_swap<double> Π±ΡΠ΄Π΅Ρ ΡΠΎΠ·Π΄Π°Π½Π° ΡΡΠ½ΠΊΡΠΈΡ Ρ ΡΠΈΠΏΠΎΠΌ double. ΠΡΠ»ΠΈ Π³Π΄Π΅-ΡΠΎ Π΄Π°Π»ΡΡΠ΅ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡ ΠΎΠΏΡΡΡ Π²ΡΡΡΠ΅ΡΠΈΡ my_swap<int>, ΡΠΎ ΠΎΠ½ Π½ΠΈΡΠ΅Π³ΠΎ Π³Π΅Π½Π΅ΡΠΈΡΠΎΠ²Π°ΡΡ Π½Π΅ Π±ΡΠ΄Π΅Ρ, Ρ.ΠΊ. ΠΊΠΎΠ΄ Π΄Π°Π½Π½ΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ ΡΠΆΠ΅ Π΅ΡΡΡ (ΡΠ°Π±Π»ΠΎΠ½ Ρ Π΄Π°Π½Π½ΡΠΌ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠΌ ΡΠΆΠ΅ ΠΈΠ½ΡΡΠ°Π½ΡΠΈΡΠΎΠ²Π°Π½).
Π’Π°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ, Π΅ΡΠ»ΠΈ ΠΌΡ ΠΈΠ½ΡΡΠ°Π½ΡΠΈΡΡΠ΅ΠΌ ΡΡΠΎΡ ΡΠ°Π±Π»ΠΎΠ½ 2 ΡΠ°Π·Π° Ρ ΡΠ°Π·Π½ΡΠΌΠΈ ΡΠΈΠΏΠ°ΠΌΠΈ, ΡΠΎ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡ ΡΠΎΠ·Π΄Π°ΡΡ 2 ΡΠ°Π·Π½ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ.
Π¨Π°Π±Π»ΠΎΠ½ β ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ ΡΡΠΊΠΎΠ½ΠΎΠΌΠΈΡΡ Π²ΡΠ΅ΠΌΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ (rutime) Π·Π°ΡΡΠ΅Ρ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΈΠΈ (compile), Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, constexpr, ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡΠ½ΠΎΠ΅ ΠΊΠΎΠ»-Π²ΠΎ ΠΊΠΎΠ΄Π°.
- ΡΠ°Π±Π»ΠΎΠ½Ρ ΡΡΠ½ΠΊΡΠΈΠΉ:
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 ΠΠΈΠ΄Π° ΠΈΠ½ΡΡΠ°Π½ΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ:
ΠΠ΅ΡΠ²Π½ΠΎΠ΅ ΠΈΠ½ΡΡΠ°Π½ΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ - ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ ΠΏΡΠΈ Π²ΡΠ·ΠΎΠ²Π΅ ΡΡΠ½ΠΊΡΠΈΠΈ ΠΈΠ»ΠΈ ΡΠΎΠ·Π΄Π°Π½ΠΈΠΈ ΠΎΠ±ΡΠ΅ΠΊΡΠ° ΠΊΠ»Π°ΡΡΠ° (ΠΎΠ±ΡΡΠ½ΠΎ Π² .h ΡΠ°ΠΉΠ»Π°Ρ )
ΠΠ»ΡΡΡ:
- Π½Π΅ Π½ΡΠΆΠ½ΠΎ ΡΠ²Π½ΠΎ ΠΈΠ½ΡΡΠ°Π½ΡΠΈΡΠΎΠ²Π°ΡΡ Π²ΡΠ΅ ΡΠΈΠΏΡ Π² .cpp ΡΠ°ΠΉΠ»Π΅
- Π½Π΅ Π½ΡΠΆΠ½ΠΎ ΡΠ²Π½ΠΎ ΠΈΠ½ΡΡΠ°Π½ΡΠΈΡΠΎΠ²Π°ΡΡ Π²ΡΠ΅ ΡΠΈΠΏΡ, Π΅ΡΠ»ΠΈ ΡΠ°Π±Π»ΠΎΠ½ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½ ΠΈ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ Π² ΠΎΠ΄Π½ΠΎΠΌ .cpp ΡΠ°ΠΉΠ»Π΅ Π² ΡΠΎΠΌ ΠΌΠ΅ΡΡΠ΅, Π³Π΄Π΅ ΠΎΠ½ Π²ΡΠ·ΡΠ²Π°Π΅ΡΡΡ ΠΠΈΠ½ΡΡΡ:
- Π Π°Π·ΠΌΠ΅ΡΠ΅Π½ΠΈΠ΅ ΡΠ°Π±Π»ΠΎΠ½ΠΎΠ² Π² .h ΡΠ°ΠΉΠ»Π°Ρ ΠΌΠΎΠΆΠ΅Ρ ΠΏΡΠΈΠ²Π΅ΡΡΠΈ ΠΊ Π·Π°Π³ΡΠΎΠΌΠΎΠΆΠ΄Π΅Π½ΠΈΡ ΡΠ°Π·ΠΌΠ΅ΡΠ° ΠΊΠΎΠ΄Π° ΠΈ ΡΠ°Π·ΠΌΠ΅ΡΠ° ΡΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ Π΄Π²ΠΎΠΈΡΠ½ΠΎΠ³ΠΎ ΡΠ°ΠΉΠ»Π°.
Π―Π²Π½ΠΎΠ΅ ΠΈΠ½ΡΡΠ°Π½ΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ - Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΠ΅Π·Π΅ΡΠ²ΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ ΡΠ»ΠΎΠ²Π° template (ΠΎΠ±ΡΡΠ½ΠΎ Π² .cpp ΡΠ°ΠΉΠ»Π°Ρ ). ΠΠ°ΠΆΠ΄Π°Ρ Π΅Π΄ΠΈΠ½ΠΈΡΠ° ΡΡΠ°Π½ΡΠ»ΡΡΠΈΠΈ ΡΡΠ°Π½ΡΠ»ΠΈΡΡΠ΅ΡΡΡ ΠΎΡΠ΄Π΅Π»ΡΠ½ΠΎ, Π° ΠΏΠΎΡΠΎΠΌ Π²ΡΡ Π»ΠΈΠ½ΠΊΡΠ΅ΡΡΡ. ΠΠ½ΡΡΠ°Π½ΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΡΠ°Π±Π»ΠΎΠ½ΠΎΠ² (ΠΏΠΎΠ΄ΡΡΠ°Π½ΠΎΠ²ΠΊΠ°) ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ Π΄ΠΎ Π»ΠΈΠ½ΠΊΠΎΠ²ΠΊΠΈ. ΠΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡ ΠΏΡΠΈ Π³Π΅Π½Π΅ΡΠΈΡΠΎΠ²Π°Π½ΠΈΠΈ ΠΊΠΎΠ΄Π° Π΄ΠΎΠ»ΠΆΠ΅Π½ Π²ΠΈΠ΄Π΅ΡΡ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΡΠ°Π±Π»ΠΎΠ½Π° (Π° Π½Π΅ ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠ±ΡΡΠ²Π»Π΅Π½ΠΈΠ΅), ΡΠ°ΠΊ ΠΈ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ ΡΠΈΠΏΠΎΠ², ΠΊΠΎΡΠΎΡΡΠ΅ ΠΏΠΎΠ΄ΡΡΠ°Π²Π»ΡΡΡΡΡ Π² ΡΠ°Π±Π»ΠΎΠ½. ΠΠΎΡΡΠΎΠΌΡ Π΅ΡΠ»ΠΈ ΠΊΠ»Π°ΡΡ/ΡΡΠ½ΠΊΡΠΈΡ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Ρ Π² .h ΡΠ°ΠΉΠ»Π΅, Π° ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ Π² .cpp ΡΠ°ΠΉΠ»Π΅, ΡΠΎ ΠΏΡΠΈ ΠΎΠ΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΊΠΎΠΌΠΏΠ»ΠΈΡΡΠΈΠΈ Π΄Π²ΡΡ .cpp ΡΠ°ΠΉΠ»ΠΎΠ² ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡ Π½Π΅ Π·Π°ΠΏΠΎΠΌΠ½ΠΈΡ ΠΏΠΎΠ΄ΡΡΠ°Π²Π»ΡΠ΅ΠΌΡΠΉ ΡΠΈΠΏ Π² ΠΎΠ΄Π½ΠΎΠΌ .cpp ΡΠ°ΠΉΠ»Π°, Π³Π΄Π΅ Π²ΡΠ·ΡΠ²Π°Π΅ΡΡΡ ΡΠ°Π±Π»ΠΎΠ½, Π²ΠΎ Π²ΡΠ΅ΠΌΡ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΈΠΈ Π΄ΡΡΠ³ΠΎΠ³ΠΎ .cpp ΡΠ°ΠΉΠ»Π°, Π³Π΄Π΅ Π½Π°Ρ ΠΎΠ΄ΠΈΡΡΡ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ ΠΌΠ΅ΡΠΎΠ΄Π°/ΠΊΠ»Π°ΡΡΠ°. Π .cpp ΡΠ°ΠΉΠ»Π΅, Π³Π΄Π΅ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ ΠΌΠ΅ΡΠΎΠ΄Π°/ΠΊΠ»Π°ΡΡΠ° Π½ΡΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°ΡΡ ΡΠ²Π½ΠΎΠ΅ ΠΈΠ½ΡΡΠ°Π½ΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅.
ΠΠ»ΡΡΡ:
- cΠΎΠΊΡΡΡΠΈΠ΅ ΡΠ²Π½ΠΎΠΉ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΠΊΠ»Π°ΡΡΠ°/ΠΌΠ΅ΡΠΎΠ΄Π° Π² .cpp ΡΠ°ΠΉΠ»Π΅
- ΠΏΡΠ΅Π΄ΠΎΡΠ²ΡΠ°ΡΠ΅Π½ΠΈΠ΅ ΠΏΠ΅ΡΠ΅ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΎΠ±ΡΠ΅ΠΊΡΠ° (ΡΠΊΠΎΠ½ΠΎΠΌΠΈΡ Π²ΡΠ΅ΠΌΡ ΠΈ ΡΠ°Π·ΠΌΠ΅Ρ)
ΠΠΈΠ½ΡΡΡ:
- ΠΡΠ»ΠΈ Π½Π΅ ΡΠΎΠ·Π΄Π°ΡΡ ΡΠ²Π½ΠΎΠ΅ ΠΈΠ½ΡΡΠ°Π½ΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ Π²ΡΠ΅Ρ ΡΠΈΠΏΠΎΠ² Π² .cpp ΡΠ°ΠΉΠ»Π΅, ΡΠΎ Π±ΡΠ΄Π΅Ρ ΠΎΡΠΈΠ±ΠΊΠ°: undefined reference
- Π―Π²Π½ΠΎ ΠΈΠ½ΡΡΠ°Π½ΡΠΈΡΠΎΠ²Π°Π½Π½Π°Ρ ΡΠ°Π±Π»ΠΎΠ½Π½Π°Ρ ΡΡΠ½ΠΊΡΠΈΡ/ΠΊΠ»Π°ΡΡ ΠΌΠΎΠ³ΡΡ ΠΈΠΌΠ΅ΡΡ ΠΊΠΎΠΏΠΈΠΈ .cpp ΡΠ°ΠΉΠ»Π°Ρ , ΡΡΠΎ ΠΌΠΎΠΆΠ΅Ρ ΡΠΎΡΠΌΠΎΠ·ΠΈΡΡ ΡΠ°ΠΌ ΠΏΡΠΎΡΠ΅ΡΡ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΈΠΈ ΠΈ ΡΠ±ΠΎΡΠΊΠΈ
Π―Π²Π½ΠΎ ΠΈΠ½ΡΡΠ°Π½ΡΠΈΡΠΎΠ²Π°Π½Π½Π°Ρ ΡΠ°Π±Π»ΠΎΠ½Π½Π°Ρ ΡΡΠ½ΠΊΡΠΈΡ/ΠΊΠ»Π°ΡΡ ΠΌΠΎΠ³ΡΡ ΠΈΠΌΠ΅ΡΡ ΠΊΠΎΠΏΠΈΠΈ .cpp ΡΠ°ΠΉΠ»Π°Ρ , ΡΡΠΎ ΠΌΠΎΠΆΠ΅Ρ ΡΠΎΡΠΌΠΎΠ·ΠΈΡΡ ΡΠ°ΠΌ ΠΏΡΠΎΡΠ΅ΡΡ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΈΠΈ ΠΈ ΡΠ±ΠΎΡΠΊΠΈ. ΠΠΎΠΆΠ½ΠΎ ΡΠΊΠ°Π·Π°ΡΡ ΡΠ²Π½ΠΎΠ΅ ΠΎΠ±ΡΡΠ²Π»Π΅Π½ΠΈΠ΅ ΠΈΠ½ΡΡΠ°Π½ΡΠΈΠ°ΡΠΈΠΈ Ρ ΠΏΠΎΠΌΠΎΡΡΡ extern Π² .h ΡΠ°ΠΉΠ»Π΅ ΠΈ ΠΎΠ΄Π½ΠΎ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π² .cpp ΡΠ°ΠΉΠ»Π΅, ΠΈ ΡΠΎΠ³Π΄Π° ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡΡ Π½Π΅ Π½ΡΠΆΠ½ΠΎ Π±ΡΠ΄Π΅Ρ ΠΈΠ½ΡΡΠ°Π½ΡΠΈΡΠΎΠ²Π°ΡΡ ΡΠ°Π±Π»ΠΎΠ½ Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Π΅Π΄ΠΈΠ½ΠΈΡΠ΅ ΡΡΠ°Π½ΡΠ»ΡΡΠΈΠΈ, ΡΡΠΎ ΡΠΌΠ΅Π½ΡΡΠ°Π΅Ρ Π²ΡΠ΅ΠΌΡ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΈΠΈ.
ΠΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡ Π² ΠΏΡΠΈΠΎΡΠΈΡΠ΅ΡΠ΅ Π²ΡΠ±ΠΈΡΠ°Π΅Ρ Π±ΠΎΠ»Π΅Π΅ ΡΠΏΠ΅ΡΠΈΠ»ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΡΠΉ ΡΠ°Π±Π»ΠΎΠ½
Π‘ΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΡΠ°Π±Π»ΠΎΠ½ΠΎΠ² ΠΏΠΎ ΠΏΡΠΈΠΎΡΠΈΡΠ΅ΡΠ°ΠΌ:
- ΠΠΎΠ»Π½Π°Ρ ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ (explicit (ΠΈΠ»ΠΈ full) specialization) - Π½Π°ΠΏΠΎΠΌΠΈΠ½Π°Π΅Ρ Π½Π°ΡΠ»Π΅Π΄ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈΠ»ΠΈ ΠΏΠ΅ΡΠ΅Π³ΡΡΠ·ΠΊΡ - template<> class vector, ΡΠΎΠ³Π΄Π° ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡ Π½Π΅ Π±ΡΠ΄Π΅Ρ Π΄ΠΎΠΏΠΈΡΡΠ²Π°ΡΡ ΠΊΠ»Π°ΡΡ ΠΏΠΎΠ΄ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΡΠΉ ΡΠΈΠΏ Π΄Π°Π½Π½ΡΡ , Π° Π²ΡΠ·ΠΎΠ²Π΅Ρ ΡΠΆΠ΅ ΠΎΠ±ΡΡΠ²Π»Π΅Π½Π½ΡΡ ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ, ΡΠ°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ ΠΌΡ ΠΌΠΎΠΆΠ΅Ρ Π·Π°ΠΏΡΠ΅ΡΠΈΡΡ Π΄Π»Ρ ΠΊΠ°ΠΊΠΎΠ³ΠΎ-ΡΠΎ ΡΠΈΠΏΠ° ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΡΠ΅ Π΄Π΅ΠΉΡΡΠ²ΠΈΡ ΠΈΠ»ΠΈ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΡ, Π² ΠΎΡΠ»ΠΈΡΠΈΠ΅ ΠΎΡ ΠΎΡΡΠ°Π»ΡΠ½ΡΡ ΡΠΈΠΏΠΎΠ²
- Π§Π°ΡΡΠΈΡΠ½Π°Ρ ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ (partial specialization) - ΡΠΎΠ»ΡΠΊΠΎ Π΄Π»Ρ ΠΊΠ»Π°ΡΡΠΎΠ² template class vector<bool, A>. ΠΠ»Ρ ΠΌΠ΅ΡΠΎΠ΄ΠΎΠ² Π½Π΅Π»ΡΠ·Ρ, Π½ΠΎ ΡΡΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ±ΠΎΠΉΡΠΈ ΡΠ΄Π΅Π»Π°ΡΡ Π² ΡΠ°ΡΡΠΈΡΠ½ΠΎΠΌ ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠΌ ΠΊΠ»Π°ΡΡΠ΅ static ΠΌΠ΅ΡΠΎΠ΄.
- ΠΡΠ½ΠΎΠ²Π½ΠΎΠΉ ΡΠ°Π±Π»ΠΎΠ½ (primary template) - vector
Π¨Π°Π±Π»ΠΎΠ½ Ρ Π·Π°ΡΠ°Π½Π΅Π΅ Π½Π΅ΠΈΠ·Π²Π΅ΡΡΠ½ΡΠΌ ΡΠΈΡΠ»ΠΎΠΌ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΎΠ². ΠΠΏΠ΅ΡΠ°ΡΠΎΡ ΠΌΠ½ΠΎΠ³ΠΎΡΠΎΡΠΈΡ ΠΈΠ»ΠΈ ΡΠ»ΠΈΠΏΡΠΈΡ (β¦), ΠΊΠΎΠ³Π΄Π° ΠΎΠ½ ΡΡΠΎΠΈΡ ΡΠ»Π΅Π²Π° ΠΎΡ ΠΈΠΌΠ΅Π½ΠΈ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ° ΡΡΠ½ΠΊΡΠΈΠΈ, ΠΎΠ½ ΠΎΠ±ΡΡΠ²Π»ΡΠ΅Ρ Π½Π°Π±ΠΎΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠ² (template<typename... Args>), ΠΊΠΎΠ³Π΄Π° ΡΡΠΎΠΈΡ ΡΠΏΡΠ°Π²Π° ΠΎΡ ΡΠ°Π±Π»ΠΎΠ½Π° ΠΈΠ»ΠΈ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠ° Π²ΡΠ·ΠΎΠ²Π° ΡΡΠ½ΠΊΡΠΈΠΈ, ΠΎΠ½ ΡΠ°ΡΠΏΠ°ΠΊΠΎΠ²ΡΠ²Π°Π΅Ρ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ Π² ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΠ΅ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΡ (Args&... args). ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, std::tuple - ΠΌΠΎΠΆΠ΅Ρ ΠΏΡΠΈΠ½ΡΡΡ Π»ΡΠ±ΠΎΠ΅ ΡΠΈΡΠ»ΠΎ Π²Ρ ΠΎΠ΄Π½ΡΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠ².
ΠΠΎ C++17: Π΄Π»Ρ ΡΠ°Π·Π²ΡΡΡΡΠ²Π°Π½ΠΈΡ ΠΏΠ°ΡΠΊΠΈ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠ² ΡΡΠ΅Π±ΡΠ΅ΡΡΡ ΡΠ΅ΠΊΡΡΡΠΈΠ²Π½ΠΎΠ΅ ΠΈΠ½ΡΡΠ°Π½ΡΠΈΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΡΠ°Π±Π»ΠΎΠ½ΠΎΠ² Ρ ΠΏΠΎΠΌΠΎΡΡΡ stub-ΡΡΠ½ΠΊΡΠΈΠΈ (Π·Π°Π³Π»ΡΡΠΊΠ°).
ΠΡΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ ΡΠ²Π΅ΡΡΠΊΠΈ - ΡΠ°Π±Π»ΠΎΠ½ Ρ Π·Π°ΡΠ°Π½Π΅Π΅ Π½Π΅ΠΈΠ·Π²Π΅ΡΡΠ½ΡΠΌ ΡΠΈΡΠ»ΠΎΠΌ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΎΠ² (variadic template). Π‘Π²Π΅ΡΡΠΊΠ° β ΡΡΠΎ ΡΡΠ½ΠΊΡΠΈΡ, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΏΡΠΈΠΌΠ΅Π½ΡΠ΅Ρ Π·Π°Π΄Π°Π½Π½ΡΡ ΠΊΠΎΠΌΠ±ΠΈΠ½ΠΈΡΡΡΡΡΡ ΡΡΠ½ΠΊΡΠΈΡ ΠΊ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΡΠΌ ΠΏΠ°ΡΠ°ΠΌ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ² Π² ΡΠΏΠΈΡΠΊΠ΅ ΠΈ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ. ΠΡΠ±ΠΎΠ΅ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ ΡΠ²ΡΡΡΠΊΠΈ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±ΡΡΡ Π·Π°ΠΊΠ»ΡΡΠ΅Π½ΠΎ Π² ΡΠΊΠΎΠ±ΠΊΠΈ ΠΈ Π² ΠΎΠ±ΡΠ΅ΠΌ Π²ΠΈΠ΄Π΅ Π²ΡΠ³Π»ΡΠ΄ΠΈΡ ΡΠ°ΠΊ: (Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΠ΅Π΅ ΠΏΠ°ΡΠΊΡ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΎΠ²). ΠΡΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ Π²Π½ΡΡΡΠΈ ΡΠΊΠΎΠ±ΠΎΠΊ Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΡ Π² ΡΠ΅Π±Π΅ Π½Π΅ΡΠ°ΡΠΊΡΡΡΡΡ ΠΏΠ°ΡΠΊΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠ² ΠΈ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· ΡΠ»Π΅Π΄ΡΡΡΠΈΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠΎΠ²:
+ - * / % ^ & | = < > << >>
+= -= *= /= %= ^= &= |= <<= >>=
== != <= >= && || , .* ->*
Π‘ΠΏΠΎΡΠΎΠ±Π½ΠΎΡΡΡ ΡΠ°Π±Π»ΠΎΠ½Π½ΠΎΠ² ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΡΡ ΡΠΈΠΏ ΠΏΠ΅ΡΠ΅Π΄Π°Π²Π°Π΅ΠΌΡΡ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΎΠ² Π±Π΅Π· ΡΠ²Π½ΠΎΠ³ΠΎ ΡΠΊΠ°Π·Π°Π½ΠΈΡ ΡΠΈΠΏΠ°: Π²ΠΌΠ΅ΡΡΠΎ foo<...>(...) ΠΌΠΎΠΆΠ½ΠΎ foo(...).
ΠΠΎ C++17 ΠΏΡΠΈ ΠΈΠ½ΡΡΠ°Π½ΡΠΈΡΠΎΠ²Π°Π½ΠΈΠΈ ΡΠ°Π±Π»ΠΎΠ½Π° ΡΡΠ½ΠΊΡΠΈΠΈ Π½ΡΠΆΠ½ΠΎ Π±ΡΠ»ΠΎ ΡΠ²Π½ΠΎ ΡΠΊΠ°Π·ΡΠ²Π°ΡΡ ΡΠΈΠΏΡ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΡ: foo<...>(...).
Π‘ΠΎΠΊΡΠ°ΡΠ΅Π½Π½ΡΠΉ ΡΠ°Π±Π»ΠΎΠ½ - ΡΠ°Π±Π»ΠΎΠ½Π½Π°Ρ ΡΡΠ½ΠΊΡΠΈΡ, ΠΊΠΎΡΠΎΡΠ°Ρ ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ auto Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΡΠΈΠΏΠ° Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠ° ΠΈΠ»ΠΈ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°ΡΡΠ΅Π³ΠΎΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΡ.
ΠΠ»ΡΡΡ:
- ΡΠΏΡΠΎΡΠ°Π΅Ρ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡ
- Π½Π΅ Π½ΡΠΆΠ½ΠΎ ΠΏΠΈΡΠ°ΡΡ template
ΠΠΈΠ½ΡΡΡ:
- Π΅ΡΠ»ΠΈ Π·Π°Π±ΡΡΡ ΡΠ΄Π΅Π»Π°ΡΡ return Π² ΡΡΠ½ΠΊΡΠΈΠΈ, ΡΠΎ ΡΡΠ½ΠΊΡΠΈΡ ΡΡΠ°Π½Π΅Ρ void
- ΠΌΠΎΠΆΠ½ΠΎ Π²Π΅ΡΠ½ΡΡΡ Π½Π΅ ΡΠΎΡ ΡΠΈΠΏ
Π Π΅ΡΠ΅Π½ΠΈΠ΅: ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΊΠΎΠ½ΡΠ΅ΠΏΡΡ Π΄Π»Ρ ΡΠΎΡΠ½ΠΎΠ³ΠΎ Π²ΠΎΠ·Π²ΡΠ°ΡΠ΅Π½ΠΈΡ Π½ΡΠΆΠ½ΠΎΠ³ΠΎ ΡΠΈΠΏΠ°
Π¨Π°Π±Π»ΠΎΠ½Π½ΡΠ΅ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΡ Π½Π΅ ΡΠ²Π»ΡΡΡΠΈΠ΅ΡΡ ΡΠΈΠΏΠ°ΠΌΠΈ - ΡΠ°Π±Π»ΠΎΠ½Π½ΡΠ΅ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΡ-ΠΊΠΎΠ½ΡΡΠ°Π½ΡΡ, Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΎΠ² ΡΠ°Π±Π»ΠΎΠ½ΠΎΠ² ΠΌΠΎΠ³ΡΡ Π²ΡΡΡΡΠΏΠ°ΡΡ ΠΊΠΎΠ½ΡΡΠ°Π½ΡΡ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ Π½Π° ΡΡΠ°ΠΏΠ΅ ΠΊΠΎΠΌΠΏΠ»ΠΈΡΡΠΈΠΈ.
C++14: ΡΠΏΠΎΡΠΎΠ± ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡ non-type template ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ Ρ Π½Π΅ΠΈΠ·Π²Π΅ΡΡΠ½ΡΠΌ ΡΠΈΠΏΠΎΠΌ Π±ΡΠ»Π° ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠ° Π΄Π²ΡΡ
ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠ² β ΡΠΈΠΏΠ° ΠΈ Π·Π½Π°ΡΠ΅Π½ΠΈΡ.
C++17: ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΈΡΠ°ΡΡ auto Π΄Π»Ρ non-type template ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠ².
Π‘++20: ΠΌΠΎΠΆΠ½ΠΎ ΡΠ°Π±ΠΎΡΠ°ΡΡ Ρ Π²Π΅ΡΠ΅ΡΡΠ²Π΅Π½Π½ΡΠΌΠΈ ΡΠΈΡΠ»Π°ΠΌΠΈ.
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);
}
- lvalue-ΡΡΡΠ»ΠΊΠ° (T = const A& ΠΈΠ»ΠΈ T = A&)
- rvalue-ΡΡΡΠ»ΠΊΠ° (T = A&&)
ΠΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΠΉ: - ΠΠ΅ΡΡΡΠ»ΠΎΡΠ½ΡΠΉ ΡΠΈΠΏ (T = A*) - ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ
ΠΠ΄Π΅Π°Π»ΡΠ½Π°Ρ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠ° ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΡΠΎΠ·Π΄Π°Π²Π°ΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ-ΠΎΠ±Π΅ΡΡΠΊΠΈ, Π³Π΄Π΅ lvalue-Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΡ ΠΊΠΎΠΏΠΈΡΡΡΡΡΡ (ΠΏΡΠΎΡΡΠΎ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΡΡΡ lvalue), Π° rvalue-Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅ΡΠ°ΡΡΡΡ (std::move).
ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅:
class Example
{
std::string field;
template <class T>
Example(T&& x) : field(std::forward<T>(x)) {}
};
Π‘ΠΆΠ°ΡΠΈΠ΅ ΡΡΡΠ»ΠΎΠΊ, ΠΊΠΎΡΠΎΡΠΎΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ Π² ΡΠ°Π±Π»ΠΎΠ½Π°Ρ
ΠΈ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅Ρ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ (ΠΎΡΠ±ΡΠ°ΡΡΠ²Π°Π΅Ρ Π½Π΅ Π½ΡΠΆΠ½ΡΠ΅ &) ΠΏΡΠΈ ΠΏΠΎΡΠ²Π»Π΅Π½ΠΈΠΈ ΡΡΡΠ»ΠΊΠΈ Π½Π° ΡΡΡΠ»ΠΊΡ. ΠΠ΅Π½ΡΡΠ΅Π΅ ΡΠΈΡΠ»ΠΎ (&) - Π²ΡΠΈΠ³ΡΡΠ²Π°Π΅Ρ Ρ Π±ΠΎΠ»ΡΡΠ΅Π³ΠΎ ΡΠΈΡΠ»Π° (&&).
ΠΡΠΈΠΌΠ΅Ρ:
T ΠΈΠ½ΡΡΠ°Π½ΡΠΈΡΠΎΠ²Π°Π½ A&&, ΡΠΎ T&& (A&& &&) = A&& // && ΠΎΡΠ±ΡΠ°ΡΡΠ²Π°Π΅ΡΡΡ
- T&(A&) = A& // & ΠΎΡΠ±ΡΠ°ΡΡΠ²Π°Π΅ΡΡΡ
- T&&(A&) = A& // && ΠΎΡΠ±ΡΠ°ΡΡΠ²Π°Π΅ΡΡΡ
- T&(A&&) = A& // && ΠΎΡΠ±ΡΠ°ΡΡΠ²Π°Π΅ΡΡΡ
- T&&(A&&) = A&& // && ΠΎΡΠ±ΡΠ°ΡΡΠ²Π°Π΅ΡΡΡ, Π½ΠΎ ΡΠΈΠΏ xvalue->lvalue
Π£Π½ΠΈΠ²Π΅ΡΡΠ°Π»ΡΠ½ΠΎΠΉ ΡΡΡΠ»ΠΊΠ° - Π°ΡΠ³ΡΠΌΠ΅Π½Ρ ΡΠΈΠΏΠ° T&&, Π³Π΄Π΅ T β ΡΠ°Π±Π»ΠΎΠ½Π½ΡΠΉ ΡΠΈΠΏ, ΠΌΠΎΠΆΠ΅Ρ ΠΏΡΠΈΠ½ΠΈΠΌΠ°ΡΡ ΠΎΠ±Π° ΡΠΈΠΏΠ° ΡΡΡΠ»ΠΎΠΊ (A& ΠΈ A&&).
ΠΡΠΈΠΌΠ΅Ρ:
template<typename T>
function(T&& arg) // arg - lvalue Π²ΡΠ΅Π³Π΄Π°, Ρ.ΠΊ. T&& arg - xvalue, ΠΏΠΎΡΡΠΎΠΌΡ Π±ΡΠ΄Π΅Ρ Π²ΡΠ·ΡΠ²Π°ΡΡΡΡ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡ ΠΊΠΎΠΏΠΈΡΠΎΠ²Π°Π½ΠΈΡ
std::move - ΠΏΡΠΈΠ²ΠΎΠ΄ΠΈΡ lvalue ΠΊ rvalue, std::forward - lvalue ΠΏΡΠΎΡΡΠΎ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ lvalue, Π° rvalue β Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ std::move(rvalue).
ΠΠ΅ΡΠ°ΡΡΠ½ΠΊΡΠΈΡ - ΡΡΠΎ ΡΠ°Π±Π»ΠΎΠ½Π½Π°Ρ (template) ΡΡΡΡΠΊΡΡΡΠ° Ρ constexpr ΡΠ»Π΅Π½Π°ΠΌΠΈ, ΠΊΠΎΡΠΎΡΡΠ΅ Π²ΡΡΠΈΡΠ»ΡΡΡΡΡ Π²ΠΎ Π²ΡΠ΅ΠΌΡ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΈΠΈ.
Π‘ΡΠ°Π½Π΄Π°ΡΡΠ½Π°Ρ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° (STL) ΠΏΡΠΈΠ΄Π΅ΡΠΆΠΈΠ²Π°Π΅ΡΡΡ ΡΠΎΠ³Π»Π°ΡΠ΅Π½ΠΈΡ, Π³Π΄Π΅ Π² ΠΌΠ΅ΡΠ°ΡΡΠ½ΠΊΡΠΈΡΡ
ΡΠΊΠ°Π·ΡΠ²Π°ΡΡΡΡ:
Π§Π»Π΅Π½Ρ:
- type - ΡΠΈΠΏ
- value - Π²ΠΎΠ·Π²ΡΠ°ΡΠ°ΡΡΠ΅Π΅ΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΡ, ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ
ΠΠΎΠ½ΡΠ΅ΠΏΡ (concept) - ΡΡΠΎ ΠΈΠΌΡ Π΄Π»Ρ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΡ, ΠΊΠΎΡΠΎΡΠΎΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π²ΠΌΠ΅ΡΡΠΎ ΡΠ»ΠΎΠ² class ΠΈΠ»ΠΈ typename Π² ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΈΠΈ Ρ template.
ΠΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΠ΅ β ΡΡΠΎ ΡΠ°Π±Π»ΠΎΠ½Π½ΠΎΠ΅ Π±ΡΠ»Π΅Π²ΠΎ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΠ΅. ΠΠΎΠ½ΡΠ΅ΠΏΡΡ ΡΠ»ΡΡΡΠ°ΡΡ ΡΠΈΡΠ°Π΅ΠΌΠΎΡΡΡ ΠΊΠΎΠ΄Π° ΠΈ ΠΎΠ±Π»Π΅Π³ΡΠ°Π΅Ρ ΠΏΠΎΠΈΡΠΊ ΠΎΡΠΈΠ±ΠΎΠΊ. ΠΠΎΠ½ΡΠ΅ΠΏΡΠΈΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π΄Π»Ρ ΠΏΠ΅ΡΠ΅Π³ΡΡΠ·ΠΊΠΈ ΡΡΠ½ΠΊΡΠΈΠΉ, ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΡΠ°Π±Π»ΠΎΠ½ΠΎΠ² ΠΈ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΠΌΠ΅ΡΠ°ΡΡΠ½ΠΊΡΠΈΠΉ. ΠΠΎΠ½ΡΠ΅ΠΏΡΡ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΡΡΡΡΡ Π±ΡΡΡΡΠ΅Π΅ ΠΎΠ±ΡΡΠ½ΠΎΠ³ΠΎ SFINAE (std::enable_if ΠΈ constexpr) ΠΈ ΡΡΠ»ΠΎΠ²ΠΈΡ Π² Π½ΠΈΡ
ΠΌΠΎΠΆΠ½ΠΎ ΡΠ°ΡΡΠΈΡΡΡΡ.
ΠΠ΅ΡΡΠΈΡ C++20 Π²Π΅ΡΠ½ΡΠ»Π°ΡΡ ΠΎΠ±ΡΠ°ΡΠ½ΠΎ ΠΊ Π΄Π²ΡΠΌ ΡΡΠ½ΠΊΡΠΈΡΠΌ, Π½ΠΎ ΡΠ΅ΠΏΠ΅ΡΡ ΠΊΠΎΠ΄ Π½Π°ΠΌΠ½ΠΎΠ³ΠΎ ΡΠΈΡΠ°Π±Π΅Π»ΡΠ½Π΅Π΅, ΡΠ΅ΠΌ Ρ std::enable_if.
requires - ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΎΠ΅ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΠ΅.
typedef Π½Π΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΡΠ΄Π΅Π»Π°ΡΡ alias (ΠΏΡΠ΅Π²Π΄ΠΎΠ½ΠΈΠΌ) Π΄Π»Ρ template. ΠΡΡΡΠ΅ ΠΏΠΎΠ»Π½ΠΎΡΡΡΡ ΠΎΡΠΊΠ°Π·Π°ΡΡΡΡ ΠΎΡ typedef ΠΈ ΠΏΠ΅ΡΠ΅ΠΉΡΠΈ Π½Π° using
ΠΠ°ΠΊΡΠΎΡ - ΡΡΠΎ ΠΌΠ΅Ρ
Π°Π½ΠΈΠ·ΠΌ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ΠΈΡ ΠΊΠΎΠ΄Π° ΠΏΡΠ΅ΠΏΡΠΎΡΠ΅ΡΡΠΎΡΠΎΠΌ Π² ΡΠ΅ΠΊΡΡ, Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΠΌΡΠ΅ ΠΠ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠΈ ΡΡΠΎΠ³ΠΎ ΡΠ΅ΡΠΊΡΠ° ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡΡ. Π‘ ΡΠ΅ΠΊΡΡΠΎΠΌ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ ΠΏΡΠ΅ΠΏΡΠΎΡΠ΅ΡΡΠΎΡ, Π΄Π»Ρ ΠΊΠΎΡΠΎΡΠΎΠ³ΠΎ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° - Π½Π°Π±ΠΎΡ ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠ² (Π±ΡΠΊΠ², ΡΠΈΡΡ, Π·Π½Π°ΠΊΠΎΠ² Π΄Π»Ρ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠΎΠ², ΠΏΡΠΎΠ±Π΅Π»ΠΎΠ², ΠΈ Ρ.Π΄.).
#include - ΡΠΊΠ°Π·Π°Π½ΠΈΠ΅ "Π²ΡΡΠ°Π²ΠΈΡΡ Π²ΠΌΠ΅ΡΡΠΎ ΠΌΠ°ΠΊΡΠΎΡΠ° Π²Π΅ΡΡ ΡΠ΅ΠΊΡΡ ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΠΈΠΉΡΡ Π² ΡΠ°ΠΉΠ»Π΅"
#define - ΡΠΊΠ°Π·Π°Π½ΠΈΠ΅ "Π²ΡΡΡΠ΅ΡΠ°Ρ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΡΡΠΈΠΉ ΠΌΠ°ΠΊΡΠΎΡ, Π²ΡΡΠ°Π²ΠΈΡΡ ΡΠ΅ΠΊΡΡ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΉ Π·Π° ΠΌΠ°ΠΊΡΠΎΡΠΎΠΌ Ρ Π·Π°ΠΌΠ΅Π½ΠΎΠΉ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΎΠ² ΠΏΠ΅ΡΠ΅Π΄Π°Π²Π°Π΅ΠΌΡΠΌ ΠΏΠΎ ΠΌΠ΅ΡΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΡΠ΅ΠΊΡΡΠΎΠΌ".
Π¨Π°Π±Π»ΠΎΠ½ - ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡ ΠΏΠΎΠ»Π½ΠΎΡΡΡΡ ΡΠ°Π·Π±ΠΈΡΠ°Π΅Ρ ΡΠ°Π±Π»ΠΎΠ½, Π²ΡΠΏΠΎΠ»Π½ΡΠ΅Ρ ΠΏΡΠΎΠ²Π΅ΡΠΊΡ ΠΊΠΎΡΡΠ΅ΠΊΡΠ½ΠΎΡΡΠΈ Π½Π° ΡΡΠΎΠ²Π½Π΅ ΡΠΈΠΏΠΎΠ², ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ , ΠΏΠΎΠ΄ΡΡΠ°Π½ΠΎΠ²ΠΎΠΊ ΡΠ°Π±Π»ΠΎΠ½ΠΎΠ², Π΄Π»Ρ ΡΡΠ½ΠΊΡΠΈΠΉ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅Ρ ΠΏΡΠΎΠ²Π΅ΡΠΊΡ ΠΏΡΠ°Π²ΠΈΠ» ΠΏΠ΅ΡΠ΅Π³ΡΡΠ·ΠΊΠΈ, ΠΈ Ρ.Π΄.
Π¨Π°Π±Π»ΠΎΠ½Ρ ΠΏΡΠ΅Π΄ΠΏΠΎΡΡΠΈΡΠ΅Π»ΡΠ½Π΅Π΅ ΠΌΠ°ΠΊΡΠΎΡΠΎΠ².
- ΡΠ°Π±Π»ΠΎΠ½Ρ ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°ΡΡΡΡ ΠΊΠΎΠΏΠΈΠ»ΡΡΠΎΡΠΎΠΌ, Π° ΠΌΠ°ΠΊΡΠΎΡΡ ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°ΡΡΡΡ ΠΏΡΠ΅ΠΏΡΠΎΡΠ΅ΡΡΠΎΡΠΎΠΌ
- Π΄Π»Ρ ΠΌΠ°ΠΊΡΠΎΡΠΎΠ² Π½Π΅Π΄ΠΎΡΡΡΠΏΠ½Ρ ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΠΈ ΠΏΠ΅ΡΠ΅Π³ΡΡΠ·ΠΊΠΈ
- ΠΌΠ°ΠΊΡΠΎΡΡ Π²ΡΠΏΠΎΠ»Π½ΡΡΡ ΡΠ΅ΠΊΡΡΠΎΠ²ΡΡ ΠΏΠΎΠ΄ΡΡΠ°Π½ΠΎΠ²ΠΊΡ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΎΠ², ΡΠ°Π±Π»ΠΎΠ½Ρ Π»Π΅ΠΊΡΠΈΡΠ΅ΡΠΊΠΈ ΠΈ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈ ΠΏΡΠΎΠ²Π΅ΡΡΡΡΡΡ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡΠΎΠΌ
- Π΄Π»Ρ ΠΌΠ°ΠΊΡΠΎΡΠΎΠ² Π½Π΅ ΠΏΡΠ΅Π΄ΡΡΠΌΠΎΡΡΠ΅Π½ΠΎ Π½ΠΈΡΠ΅Π³ΠΎ ΠΏΠΎΡ ΠΎΠΆΠ΅Π³ΠΎ Π½Π° ΠΎΡΠ»ΠΎΠΆΠ΅Π½Π½ΠΎΠ΅ (Π½Π΅ΡΠ²Π½ΠΎΠ΅) ΠΈΠ½ΡΡΠ°Π½ΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅, ΠΊΠΎΡΠΎΡΠΎΠ΅ ΠΎΡΠ΅Π½Ρ Π²ΠΎΡΡΡΠ΅Π±ΠΎΠ²Π°Π½ΠΎ ΠΏΡΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠΈ ΡΠ°Π±Π»ΠΎΠ½ΠΎΠ²
- ΠΌΠ°ΠΊΡΠΎΡΡ ΡΡΡΠ΅ΡΡΠ²Π΅Π½Π½ΠΎ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ°ΡΠΈΡΠ½Π΅Π΅ Π² ΠΎΡΠ»Π°Π΄ΠΊΠ΅ ΠΈ ΠΏΠΎΠΈΡΠΊΠ΅ ΠΎΡΠΈΠ±ΠΎΠΊ, ΡΠ΅ΠΌ ΡΠ°Π±Π»ΠΎΠ½Ρ
- ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΈΡ ΡΠ°Π±Π»ΠΎΠ½ΠΎΠ² ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ Π±ΡΡΡΡΠ΅Π΅, ΡΠ΅ΠΌ Π² ΡΠΊΠ²ΠΈΠ²Π°Π»Π΅Π½ΡΠ½ΠΎΠΉ Π²Π΅ΡΡΠΈΠΈ ΠΌΠ°ΠΊΡΠΎΡΠ°
Π¨Π°Π±Π»ΠΎΠ½Ρ β ΠΏΠΎΠΌΠΎΠ³Π°ΡΡ ΡΡΠΊΠΎΠ½ΠΎΠΌΠΈΡΡ Π²ΡΠ΅ΠΌΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ (rutime) Π·Π°ΡΡΠ΅Ρ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΈΠΈ (compile), Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, constexpr, ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡΠ½ΠΎΠ΅ ΠΊΠΎΠ»-Π²ΠΎ ΠΊΠΎΠ΄Π°.
Π‘uriously Recurring Template Pattern - ΡΠ΅ΠΊΡΡΡΠΈΠ²Π½ΡΠΉ ΡΠ°Π±Π»ΠΎΠ½: ΠΊΠ»Π°ΡΡ Derived Π½Π°ΡΠ»Π΅Π΄ΡΠ΅ΡΡΡ ΠΎΡ ΡΠ°Π±Π»ΠΎΠ½Π½ΠΎΠ³ΠΎ ΠΊΠ»Π°ΡΡΠ° Base, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΠ΅Π³ΠΎ Derived ΠΊΠ°ΠΊ ΡΠ°Π±Π»ΠΎΠ½Π½ΡΠΉ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ T. Π§Π΅ΡΠ΅Π· ΠΌΠ΅ΡΠΎΠ΄ Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ ΠΊΠ»Π°ΡΡΠ° Base ΠΌΠΎΠΆΠ½ΠΎ Π²ΡΠ·Π²Π°ΡΡ ΠΌΠ΅ΡΠΎΠ΄ Π½Π°ΡΠ»Π΅Π΄ΡΠ΅ΠΌΠΎΠ³ΠΎ ΠΊΠ»Π°ΡΡΠ° Derived, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ ΡΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠΉ ΠΏΠΎΠ»ΠΈΠΌΠΎΡΡΠΈΠ·ΠΌ Π²ΠΌΠ΅ΡΡΠΎ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΎΠ³ΠΎ ΠΏΠΎΠ»ΠΈΠΌΠΎΡΡΠΈΠ·ΠΌΠ° (Π±Π΅Π· ΡΠ°Π±Π»ΠΈΡΡ Π²ΠΈΡΡΡΠ°Π»ΡΠ½ΡΡ
ΡΡΠ½ΠΊΡΠΈΠΉ):
static_cast<T*>(this)->method()
ΠΠ»ΡΡΡ:
- Π΄Π΅Π»Π°Π΅ΡΡΡ Π²ΠΎ Π²ΡΠ΅ΠΌΡ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΈΠΈ (compile), Π° Π½Π΅ Π²ΠΎ Π²ΡΠ΅ΠΌΡ ΠΈΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ (runtime)
- Π½Π΅Ρ Π½Π°ΠΊΠ»Π°Π΄Π½ΡΡ ΡΠ°ΡΡ ΠΎΠ΄ΠΎΠ² Π½Π° ΡΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΡΠ°Π±Π»ΠΈΡ Π²ΠΈΡΡΡΠ°Π»ΡΠ½ΡΡ ΡΡΠ½ΠΊΡΠΈΠΉ
- Π²ΡΠ΅ΠΌΡ, Π·Π°ΡΡΠ°ΡΠΈΠ²Π°Π΅ΠΌΠΎΠ΅ Π½Π° Π²ΡΠ±ΠΎΡ ΠΌΠ΅ΡΠΎΠ΄Π° Π² ΡΠ°Π±Π»ΠΈΡΠ΅ Π²ΠΈΡΡΡΠ°Π»ΡΠ½ΡΡ ΡΡΠ½ΠΊΡΠΈΠΉ
ΠΠΈΠ½ΡΡΡ:
- Ρ Π²ΡΠ΅Ρ ΠΊΠ»Π°ΡΡΠΎΠ²-Π½Π°ΡΠ»Π΅Π΄Π½ΠΈΠΊΠΎΠ² Π΄ΠΎΠ»ΠΆΠ½Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Ρ ΠΌΠ΅ΡΠΎΠ΄Ρ, ΠΊΠΎΡΠΎΡΡΠ΅ Π²ΡΠ·ΡΠ²Π°ΡΡΡΡ Π² Π±Π°Π·ΠΎΠ²ΠΎΠΌ ΠΊΠ»Π°ΡΡΠ΅
Substitution Failure Is Not An Error - ΠΏΡΠΈ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ ΠΏΠ΅ΡΠ΅Π³ΡΡΠ·ΠΎΠΊ ΡΡΠ½ΠΊΡΠΈΠΈ ΠΎΡΠΈΠ±ΠΎΡΠ½ΡΠ΅ ΠΏΠΎΠ΄ΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ Π² ΡΠ°Π±Π»ΠΎΠ½Ρ Π½Π΅ Π²ΡΠ·ΡΠ²Π°ΡΡ ΠΎΡΠΈΠ±ΠΊΡ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΈΠΈ, Π° ΠΎΡΠ±ΡΠ°ΡΡΠ²Π°ΡΡΡΡ ΠΈΠ· ΡΠΏΠΈΡΠΊΠ° ΠΊΠ°Π½Π΄ΠΈΠ΄Π°ΡΠΎΠ² Π½Π° Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ΡΡΡΡ ΠΏΠ΅ΡΠ΅Π³ΡΡΠ·ΠΊΡ.
ΠΡΠ°Π²ΠΈΠ»Π°:
- SFINAE ΡΡΠΎ ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΠΎ ΡΠ²ΡΠ·Π°Π½ΠΎ Ρ ΠΏΠ΅ΡΠ΅Π³ΡΡΠ·ΠΊΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΉ
- ΡΡΠΎ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ ΠΏΡΠΈ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΎΠΌ Π²ΡΠ²ΠΎΠ΄Π΅ ΡΠΈΠΏΠΎΠ² ΡΠ°Π±Π»ΠΎΠ½Π° (type deduction) ΠΏΠΎ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠ°ΠΌ ΡΡΠ½ΠΊΡΠΈΠΈ
- Π½Π΅ΠΊΠΎΡΠΎΡΡΠ΅ ΠΏΠ΅ΡΠ΅Π³ΡΡΠ·ΠΊΠΈ ΠΌΠΎΠ³ΡΡ ΠΎΡΠ±ΡΠ°ΡΡΠ²Π°ΡΡΡΡ Π² ΡΠΎΠΌ ΡΠ»ΡΡΠ°Π΅, ΠΊΠΎΠ³Π΄Π° ΠΈΡ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡ ΠΈΠ·-Π·Π° Π²ΠΎΠ·Π½ΠΈΠΊΠ°ΡΡΠ΅ΠΉ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΎΠΉ ΠΎΡΠΈΠ±ΠΊΠΈ, ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΈΡ ΠΏΡΠΈ ΡΡΠΎΠΌ ΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΠ°Π΅ΡΡΡ - Π±Π΅Π· ΠΎΡΠΈΠ±ΠΎΠΊ
- ΠΎΡΠ±ΡΠΎΡΠΈΡΡ ΠΌΠΎΠ³ΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΡΠ°Π±Π»ΠΎΠ½
- SFINAE ΡΠ°ΡΡΠΌΠ°ΡΡΠΈΠ²Π°Π΅Ρ ΡΠΎΠ»ΡΠΊΠΎ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ ΡΡΠ½ΠΊΡΠΈΠΈ, ΠΎΡΠΈΠ±ΠΊΠΈ Π² ΡΠ΅Π»Π΅ ΡΡΠ½ΠΊΡΠΈΠΈ Π½Π΅ Π±ΡΠ΄ΡΡ ΠΏΡΠΎΠΏΡΡΠ΅Π½Ρ
ΠΠ°ΡΡΠ΅ΡΠ½ ΡΠΎΠΏΠΎΡΡΠ°Π²Π»ΡΡΡΠΈΠΉ ΡΠΈΠΏΡ, ΠΊΠΎΡΠΎΡΡΠΉ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ°ΡΡΠΌΠ°ΡΡΠΈΠ²Π°ΡΡ ΠΊΠ°ΠΊ ΠΎΠ±ΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠ° 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