Π Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ΅ TR1 (ΡΠΌ. ΠΏΡΠ°Π²ΠΈΠ»ΠΎ 54) Π΅ΡΡΡ ΡΠ΅Π»ΡΠΉ ΡΡΠ΄ Π½ΠΎΠ²ΡΡ ΠΊΠ»Π°ΡΡΠΎΠ²-Ρ Π°ΡΠ°ΠΊΡΠ΅ΡΠΈΡΡΠΈΠΊ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΡΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΎ ΡΠΈΠΏΠ°Ρ , Π²ΠΊΠ»ΡΡΠ°Ρ is_fundamental<T> (Π³Π΄Π΅ T β Π²ΡΡΡΠΎΠ΅Π½Π½ΡΠΉ ΡΠΈΠΏ), is_array<T> (Π³Π΄Π΅ T β ΡΠΈΠΏ ΠΌΠ°ΡΡΠΈΠ²Π°) ΠΈ is_base_of<T1,T2> (ΡΠΎ Π΅ΡΡΡ ΡΠ²Π»ΡΠ΅ΡΡΡ Π»ΠΈ T1 ΡΠ΅ΠΌ ΠΆΠ΅, ΡΡΠΎ ΠΈ T2, Π»ΠΈΠ±ΠΎ Π΅Π³ΠΎ Π±Π°Π·ΠΎΠ²ΡΠΌ ΠΊΠ»Π°ΡΡΠΎΠΌ). ΠΡΠ΅Π³ΠΎ TR1 Π΄ΠΎΠ±Π°Π²Π»ΡΠ΅Ρ ΠΊ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΠΎΠΌΡ C++ Π±ΠΎΠ»Π΅Π΅ 50 ΠΊΠ»Π°ΡΡΠΎΠ²-Ρ Π°ΡΠ°ΠΊΡΠ΅ΡΠΈΡΡΠΈΠΊ.
Π§ΡΠΎ ΡΠ»Π΅Π΄ΡΠ΅Ρ ΠΏΠΎΠΌΠ½ΠΈΡΡβ’ ΠΠ»Π°ΡΡΡ-Ρ Π°ΡΠ°ΠΊΡΠ΅ΡΠΈΡΡΠΈΠΊΠΈ Π΄Π΅Π»Π°ΡΡ Π΄ΠΎΡΡΡΠΏΠ½ΠΎΠΉ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΎ ΡΠΈΠΏΠ°Ρ Π²ΠΎ Π²ΡΠ΅ΠΌΡ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΈΠΈ. ΠΠ½ΠΈ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Ρ Ρ ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ΠΌ ΡΠ°Π±Π»ΠΎΠ½ΠΎΠ² ΠΈ ΠΈΡ ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΉ.
β’ Π ΡΠΎΡΠ΅ΡΠ°Π½ΠΈΠΈ Ρ ΠΏΠ΅ΡΠ΅Π³ΡΡΠ·ΠΊΠΎΠΉ ΠΊΠ»Π°ΡΡΡ-Ρ Π°ΡΠ°ΠΊΡΠ΅ΡΠΈΡΡΠΈΠΊΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡΡ ΠΏΡΠΎΠ²Π΅ΡΡΡΡ ΡΠΈΠΏΡ Π²ΠΎ Π²ΡΠ΅ΠΌΡ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΈΠΈ.
ΠΡΠ°Π²ΠΈΠ»ΠΎ 48: ΠΠ·ΡΡΠΈΡΠ΅ ΠΌΠ΅ΡΠ°ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΡΠ°Π±Π»ΠΎΠ½ΠΎΠ²
ΠΠ΅ΡΠ°ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΡΠ°Π±Π»ΠΎΠ½ΠΎΠ² (template metaprogramming β TMP) β ΡΡΠΎ ΠΏΡΠΎΡΠ΅ΡΡ Π½Π°ΠΏΠΈΡΠ°Π½ΠΈΡ ΠΎΡΠ½ΠΎΠ²Π°Π½Π½ΡΡ Π½Π° ΡΠ°Π±Π»ΠΎΠ½Π°Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌ Π½Π° C++, ΠΈΡΠΏΠΎΠ»Π½ΡΠ΅ΠΌΡΡ Π²ΠΎ Π²ΡΠ΅ΠΌΡ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΈΠΈ. ΠΠ° ΠΌΠΈΠ½ΡΡΡ Π·Π°Π΄ΡΠΌΠ°ΠΉΡΠ΅ΡΡ ΠΎΠ± ΡΡΠΎΠΌ: ΡΠ°Π±Π»ΠΎΠ½Π½Π°Ρ ΠΌΠ΅ΡΠ°ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° β ΡΡΠΎ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ°, Π½Π°ΠΏΠΈΡΠ°Π½Π½Π°Ρ Π½Π° C++, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΈΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ Π²Π½ΡΡΡΠΈ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡΠ° C+ +. ΠΠΎΠ³Π΄Π° TMP-ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° Π·Π°Π²Π΅ΡΡΠ°Π΅Ρ ΠΈΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅, Π΅Π΅ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ β ΡΡΠ°Π³ΠΌΠ΅Π½ΡΡ ΠΊΠΎΠ΄Π° Π½Π° C++, ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΡΠ΅ ΠΈΠ· ΡΠ°Π±Π»ΠΎΠ½ΠΎΠ², β ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΡΠ΅ΡΡΡ ΠΊΠ°ΠΊ ΠΎΠ±ΡΡΠ½ΠΎ.
ΠΡΠ»ΠΈ ΡΡΠ° ΠΈΠ΄Π΅Ρ Π½Π΅ ΠΏΠΎΡΠ°Π·ΠΈΠ»Π° Π²Π°Ρ Π΄ΠΎ Π³Π»ΡΠ±ΠΈΠ½Ρ Π΄ΡΡΠΈ, Π·Π½Π°ΡΠΈΡ, Π²Ρ Π½Π΅Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ Π½Π°ΠΏΡΡΠΆΠ΅Π½Π½ΠΎ Π΄ΡΠΌΠ°Π»ΠΈ ΠΎ Π½Π΅ΠΉ.
C++ Π½Π΅ ΠΏΡΠ΅Π΄Π½Π°Π·Π½Π°ΡΠ°Π»ΡΡ Π΄Π»Ρ ΠΌΠ΅ΡΠ°ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΡΠ°Π±Π»ΠΎΠ½ΠΎΠ², Π½ΠΎ Ρ ΡΠ΅Ρ ΠΏΠΎΡ, ΠΊΠ°ΠΊ ΡΠ΅Ρ Π½ΠΎΠ»ΠΎΠ³ΠΈΡ TMP Π±ΡΠ»Π° ΠΎΡΠΊΡΡΡΠ° Π² Π½Π°ΡΠ°Π»Π΅ 90-Ρ Π³ΠΎΠ΄ΠΎΠ², ΠΎΠ½Π° ΠΎΠΊΠ°Π·Π°Π»Π°ΡΡ Π½Π°ΡΡΠΎΠ»ΡΠΊΠΎ ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠΉ, ΡΡΠΎ, Π²Π΅ΡΠΎΡΡΠ½ΠΎ, ΠΈ Π² ΡΠ°ΠΌ ΡΠ·ΡΠΊ, ΠΈ Π² ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΡΡ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΡ Π±ΡΠ΄ΡΡ Π²ΠΊΠ»ΡΡΠ΅Π½Ρ ΡΠ°ΡΡΠΈΡΠ΅Π½ΠΈΡ, ΠΎΠ±Π»Π΅Π³ΡΠ°ΡΡΠΈΠ΅ ΡΠ°Π±ΠΎΡΡ Ρ TMP. ΠΠ°, TMP Π±ΡΠ»ΠΎ ΠΈΠΌΠ΅Π½Π½ΠΎ ΠΎΡΠΊΡΡΡΠΎ, Π° Π½Π΅ ΠΏΡΠΈΠ΄ΡΠΌΠ°Π½ΠΎ. Π‘ΡΠ΅Π΄ΡΡΠ²Π°, Π»Π΅ΠΆΠ°ΡΠΈΠ΅ Π² ΠΎΡΠ½ΠΎΠ²Π΅ TMP, ΠΏΠΎΡΠ²ΠΈΠ»ΠΈΡΡ Π² C++ Π²ΠΌΠ΅ΡΡΠ΅ Ρ ΡΠ°Π±Π»ΠΎΠ½Π°ΠΌΠΈ. ΠΡΠΆΠ½ΠΎ Π±ΡΠ»ΠΎ ΡΠΎΠ»ΡΠΊΠΎ, ΡΡΠΎΠ±Ρ ΠΊΡΠΎ-ΡΠΎ Π·Π°ΠΌΠ΅ΡΠΈΠ», ΠΊΠ°ΠΊ ΠΎΠ½ΠΈ ΠΌΠΎΠ³ΡΡ Π±ΡΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½Ρ ΠΈΠ·ΠΎΠ±ΡΠ΅ΡΠ°ΡΠ΅Π»ΡΠ½ΡΠΌ ΠΈ Π½Π΅ΠΎΠΆΠΈΠ΄Π°Π½Π½ΡΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ.
Π’Π΅Ρ Π½ΠΎΠ»ΠΎΠ³ΠΈΡ TMP Π΄Π°Π΅Ρ Π΄Π²Π° ΠΏΡΠ΅ΠΈΠΌΡΡΠ΅ΡΡΠ²Π°. ΠΠΎ-ΠΏΠ΅ΡΠ²ΡΡ , ΠΎΠ½Π° ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ Π΄Π΅Π»Π°ΡΡ ΡΠ°ΠΊΠΈΠ΅ Π²Π΅ΡΠΈ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΈΠ½ΡΠΌΠΈ ΡΠΏΠΎΡΠΎΠ±Π°ΠΌΠΈ ΡΠ΄Π΅Π»Π°ΡΡ Π±ΡΠ»ΠΎ Π±Ρ ΡΡΡΠ΄Π½ΠΎ Π»ΠΈΠ±ΠΎ Π²ΠΎΠΎΠ±ΡΠ΅ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ. ΠΠΎ-Π²ΡΠΎΡΡΡ , ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΡΠ°Π±Π»ΠΎΠ½Π½ΡΠ΅ ΠΌΠ΅ΡΠ°ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ ΠΈΡΠΏΠΎΠ»Π½ΡΡΡΡΡ Π²ΠΎ Π²ΡΠ΅ΠΌΡ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΈΠΈ C++, ΠΎΠ½ΠΈ ΠΌΠΎΠ³ΡΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅ΡΡΠΈΡΡ ΡΠ°ΡΡΡ ΡΠ°Π±ΠΎΡΡ ΡΠΎ ΡΡΠ°Π΄ΠΈΠΈ ΠΈΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ Π½Π° ΡΡΠ°Π΄ΠΈΡ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΈΠΈ. Π ΡΠ°ΡΡΠ½ΠΎΡΡΠΈ, Π½Π΅ΠΊΠΎΡΠΎΡΡΠ΅ ΠΎΡΠΈΠ±ΠΊΠΈ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΎΠ±ΡΡΠ½ΠΎ Π²ΡΠΏΠ»ΡΠ²Π°ΡΡ Π²ΠΎ Π²ΡΠ΅ΠΌΡ ΠΈΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ, ΠΌΠΎΠΆΠ½ΠΎ Π±ΡΠ»ΠΎ Π±Ρ ΠΎΠ±Π½Π°ΡΡΠΆΠΈΡΡ ΠΏΡΠΈ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΈΠΈ. ΠΡΡΠ³ΠΎΠ΅ ΠΏΡΠ΅ΠΈΠΌΡΡΠ΅ΡΡΠ²ΠΎ β ΡΡΠΎ ΡΠΎ, ΡΡΠΎ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ C++, Π½Π°ΠΏΠΈΡΠ°Π½Π½ΡΠ΅ Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ TMP, ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°ΡΡ ΡΡΡΠ΅ΠΊΡΠΈΠ²Π½ΡΠΌΠΈ ΠΏΠΎΡΡΠΈ Π²ΠΎ Π²ΡΠ΅Ρ ΡΠΌΡΡΠ»Π°Ρ : ΠΊΠΎΠΌΠΏΠ°ΠΊΡΠ½ΠΎΡΡΡ ΠΈΡΠΏΠΎΠ»Π½ΡΠ΅ΠΌΠΎΠ³ΠΎ, ΠΊΠΎΠ΄ Π±ΡΡΡΡΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΡ, ΠΏΠΎΡΡΠ΅Π±Π»Π΅Π½ΠΈΡ ΠΏΠ°ΠΌΡΡΠΈ. ΠΠΎ ΠΊΠΎΠ»Ρ ΡΠΊΠΎΡΠΎ ΡΠ°ΡΡΡ ΡΠ°Π±ΠΎΡΡ ΠΏΠ΅ΡΠ΅Π½ΠΎΡΠΈΡΡΡ Π½Π° ΡΡΠ°Π΄ΠΈΡ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΈΠΈ, ΡΠΎ, ΠΎΡΠ΅Π²ΠΈΠ΄Π½ΠΎ, ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΈΡ Π·Π°ΠΉΠΌΠ΅Ρ Π±ΠΎΠ»ΡΡΠ΅ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ. ΠΠ»Ρ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΈΠΈ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌ, Π² ΠΊΠΎΡΠΎΡΡΡ ΠΏΡΠΈΠΌΠ΅Π½ΡΠ΅ΡΡΡ ΡΠ΅Ρ Π½ΠΎΠ»ΠΎΠ³ΠΈΡ TMP, ΠΌΠΎΠΆΠ΅Ρ ΠΏΠΎΡΡΠ΅Π±ΠΎΠ²Π°ΡΡΡΡ Π½Π°ΠΌΠ½ΠΎΠ³ΠΎ Π±ΠΎΠ»ΡΡΠ΅ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ, ΡΠ΅ΠΌ Π΄Π»Ρ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΈΠΈ Π°Π½Π°Π»ΠΎΠ³ΠΈΡΠ½ΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌ, Π½Π°ΠΏΠΈΡΠ°Π½Π½ΡΡ Π±Π΅Π· ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΡ TMP.
Π Π°ΡΡΠΌΠΎΡΡΠΈΠΌ ΠΏΡΠ΅Π²Π΄ΠΎΠΊΠΎΠ΄ ΡΠ°Π±Π»ΠΎΠ½Π½ΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ advance, ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½Π½ΡΠΉ Π½Π° ΡΡΡ. 227 (ΡΠΌ. ΠΏΡΠ°Π²ΠΈΠ»ΠΎ 47; Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΠΈΠΌΠ΅Π΅Ρ ΡΠΌΡΡΠ» ΠΏΠ΅ΡΠ΅ΡΠΈΡΠ°ΡΡ ΡΡΠΎ ΠΏΡΠ°Π²ΠΈΠ»ΠΎ ΡΠ΅ΠΉΡΠ°Ρ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ Π½ΠΈΠΆΠ΅ Ρ ΠΏΡΠ΅Π΄ΠΏΠΎΠ»Π°Π³Π°Ρ, ΡΡΠΎ Π²Ρ Π·Π½Π°ΠΊΠΎΠΌΡ Ρ ΠΈΠ·Π»ΠΎΠΆΠ΅Π½Π½ΡΠΌ Π² Π½Π΅ΠΌ ΠΌΠ°ΡΠ΅ΡΠΈΠ°Π»ΠΎΠΌ). Π― Π²ΡΠ΄Π΅Π»ΠΈΠ» Π² ΡΡΠΎΠΌ ΡΡΠ°Π³ΠΌΠ΅Π½ΡΠ΅ ΡΠ°ΡΡΡ, Π½Π°ΠΏΠΈΡΠ°Π½Π½ΡΡ Π½Π° ΠΏΡΠ΅Π²Π΄ΠΎΠΊΠΎΠ΄Π΅:
template<typename IterT, typename DistT>
void advance(IterT& iter, DistT d)
{
if (iter ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΈΡΠ΅ΡΠ°ΡΠΎΡΠΎΠΌ Ρ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ»ΡΠ½ΡΠΌ Π΄ΠΎΡΡΡΠΏΠΎΠΌ) {
iter += d; // ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΈΡΠ΅ΡΠ°ΡΠΎΡΠ½ΡΡ Π°ΡΠΈΡΠΌΠ΅ΡΠΈΠΊΡ
} // Π΄Π»Ρ ΠΈΡΠ΅ΡΠ°ΡΠΎΡΠΎΠ² Ρ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ»ΡΠ½ΡΠΌ Π΄ΠΎΡΡΡΠΏΠΎΠΌ
else {
if(d>=0) {while (dβ) ++iter;} // Π²ΡΠ·ΡΠ²Π°ΡΡ ++ ΠΈΠ»ΠΈ β Π² ΡΠΈΠΊΠ»Π΅
else {while(d++) βiter;} // Π΄Π»Ρ ΠΈΡΠ΅ΡΠ°ΡΠΎΡΠΎΠ² Π΄ΡΡΠ³ΠΈΡ ΠΊΠ°ΡΠ΅Π³ΠΎΡΠΈΠΉ
}
}
ΠΡ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ typeid, ΡΡΠΎΠ±Ρ Π·Π°ΠΌΠ΅Π½ΠΈΡΡ ΠΏΡΠ΅Π²Π΄ΠΎΠΊΠΎΠ΄ ΡΠ΅Π°Π»ΡΠ½ΡΠΌ ΠΊΠΎΠ΄ΠΎΠΌ. Π’ΠΎΠ³Π΄Π° Π·Π°Π΄Π°ΡΠ° Π±ΡΠ΄Π΅Ρ ΡΠ΅ΡΠ΅Π½Π° Β«Π½ΠΎΡΠΌΠ°Π»ΡΠ½ΡΠΌΒ» Π΄Π»Ρ C++ ΡΠΏΠΎΡΠΎΠ±ΠΎΠΌ β Π²ΡΡ ΡΠ°Π±ΠΎΡΠ° Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ Π²ΠΎ Π²ΡΠ΅ΠΌΡ ΠΈΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ:
template<typename IterT, typename DistT>
void advance(IterT& iter, DistT d)
{
if (typeid(typename std::iterator_traits<IterT>::iterator_category)==
typeid(std::random_access_iterator_tag))
iter += d; // ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΈΡΠ΅ΡΠ°ΡΠΈΠ²Π½ΡΡ Π°ΡΠΈΡΠΌΠ΅ΡΠΈΠΊΡ
} // Π΄Π»Ρ ΠΈΡΠ΅ΡΠ°ΡΠΎΡΠΎΠ² Ρ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ»ΡΠ½ΡΠΌ Π΄ΠΎΡΡΡΠΏΠΎΠΌ
else {
if(d>=0) {while (dβ) ++iter;} // Π²ΡΠ·ΡΠ²Π°ΡΡ ++ ΠΈΠ»ΠΈ β Π² ΡΠΈΠΊΠ»Π΅
else {while(d++) βiter;} // Π΄Π»Ρ ΠΈΡΠ΅ΡΠ°ΡΠΎΡΠΎΠ² Π΄ΡΡΠ³ΠΈΡ ΠΊΠ°ΡΠ΅Π³ΠΎΡΠΈΠΉ
}
}
Π ΠΏΡΠ°Π²ΠΈΠ»Π΅ 47 ΠΎΡΠΌΠ΅ΡΠ΅Π½ΠΎ, ΡΡΠΎ ΠΏΠΎΠ΄Ρ ΠΎΠ΄, ΠΎΡΠ½ΠΎΠ²Π°Π½Π½ΡΠΉ Π½Π° typeid, ΠΌΠ΅Π½Π΅Π΅ ΡΡΡΠ΅ΠΊΡΠΈΠ²Π΅Π½, ΡΠ΅ΠΌ ΠΏΡΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠΈ ΠΊΠ»Π°ΡΡΠΎΠ²-Ρ Π°ΡΠ°ΠΊΡΠ΅ΡΠΈΡΡΠΈΠΊ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ Π² ΡΡΠΎΠΌ ΡΠ»ΡΡΠ°Π΅: (1) ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° ΡΠΈΠΏΠ° ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ Π²ΠΎ Π²ΡΠ΅ΠΌΡ ΠΈΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ, Π° Π½Π΅ Π²ΠΎ Π²ΡΠ΅ΠΌΡ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΈΠΈ, ΠΈ (2) ΠΊΠΎΠ΄, Π²ΡΠΏΠΎΠ»Π½ΡΡΡΠΈΠΉ ΠΏΡΠΎΠ²Π΅ΡΠΊΡ ΡΠΈΠΏΠ°, Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±ΡΡΡ Π²ΠΊΠ»ΡΡΠ΅Π½ Π² ΠΈΡΠΏΠΎΠ»Π½ΡΠ΅ΠΌΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ. Π€Π°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈ ΡΡΠΎΡ ΠΏΡΠΈΠΌΠ΅Ρ ΠΏΠΎΠΊΠ°Π·ΡΠ²Π°Π΅Ρ, ΠΊΠ°ΠΊ ΡΠ΅Ρ Π½ΠΎΠ»ΠΎΠ³ΠΈΡ TMP ΠΌΠΎΠΆΠ΅Ρ ΠΏΠΎΡΠΎΠΆΠ΄Π°ΡΡ Π±ΠΎΠ»Π΅Π΅ ΡΡΡΠ΅ΠΊΡΠΈΠ²Π½ΡΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ Π½Π° C++, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ Ρ Π°ΡΠ°ΠΊΡΠ΅ΡΠΈΡΡΠΈΠΊΠΈ β ΡΡΠΎ ΠΈ Π΅ΡΡΡ ΡΠ°ΡΡΠ½ΡΠΉ ΡΠ»ΡΡΠ°ΠΉ TMP. ΠΠ°ΠΏΠΎΠΌΠ½Ρ, ΡΡΠΎ Ρ Π°ΡΠ°ΠΊΡΠ΅ΡΠΈΡΡΠΈΠΊΠΈ Π΄Π΅Π»Π°ΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΡΠΌ Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΠ΅ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΡ ifβ¦else Π²ΠΎ Π²ΡΠ΅ΠΌΡ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΈΠΈ.
Π― ΡΠΆΠ΅ ΠΎΡΠΌΠ΅ΡΠ°Π» Π²ΡΡΠ΅, ΡΡΠΎ Π½Π΅ΠΊΠΎΡΠΎΡΡΠ΅ Π²Π΅ΡΠΈ ΡΠ΅Ρ Π½ΠΎΠ»ΠΎΠ³ΠΈΡ TMP ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΡΠ΄Π΅Π»Π°ΡΡ ΠΏΡΠΎΡΠ΅, ΡΠ΅ΠΌ Β«Π½ΠΎΡΠΌΠ°Π»ΡΠ½ΡΠΉΒ» C++, ΠΈ advance ΠΌΠΎΠΆΠ½ΠΎ ΡΡΠΈΡΠ°ΡΡ ΠΈΠ»Π»ΡΡΡΡΠ°ΡΠΈΠΉ ΡΡΠΎΠ³ΠΎ ΡΡΠ²Π΅ΡΠΆΠ΄Π΅Π½ΠΈΡ. Π ΠΏΡΠ°Π²ΠΈΠ»Π΅ 47 ΡΠΏΠΎΠΌΠΈΠ½Π°Π΅ΡΡΡ ΠΎ ΡΠΎΠΌ, ΡΡΠΎ ΠΎΡΠ½ΠΎΠ²Π°Π½Π½Π°Ρ Π½Π° typeid ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ advance ΠΌΠΎΠΆΠ΅Ρ ΠΏΡΠΈΠ²Π΅ΡΡΠΈ ΠΊ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ°ΠΌ Π²ΠΎ Π²ΡΠ΅ΠΌΡ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΈΠΈ, ΠΈ Π²ΠΎΡ Π²Π°ΠΌ ΠΏΡΠΈΠΌΠ΅Ρ ΡΠ°ΠΊΠΎΠΉ ΡΠΈΡΡΠ°ΡΠΈΠΈ:
std::list<int>::iterator iter;
...
advance(iter, 10); // ΡΠ΄Π²ΠΈΠ½ΡΡΡ iter Π½Π° 10 ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ² Π²ΠΏΠ΅ΡΠ΅Π΄
// Π½Π΅ ΡΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΡΠ΅ΡΡΡ Π΄Π»Ρ ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΉ
// Π²ΡΡΠ΅ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ
Π Π°ΡΡΠΌΠΎΡΡΠΈΠΌ Π²Π΅ΡΡΠΈΡ advance, ΠΊΠΎΡΠΎΡΠ°Ρ Π±ΡΠ΄Π΅Ρ ΡΠ³Π΅Π½Π΅ΡΠΈΡΠΎΠ²Π°Π½Π° Π΄Π»Ρ ΡΡΠΎΠ³ΠΎ Π²ΡΠ·ΠΎΠ²Π°. ΠΠΎΡΠ»Π΅ ΠΏΠΎΠ΄ΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ ΡΠΈΠΏΠΎΠ² iter ΠΈ 10 Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠ² ΡΠ°Π±Π»ΠΎΠ½Π° IterT ΠΈ DistT ΠΌΡ ΠΏΠΎΠ»ΡΡΠΈΠΌ ΡΠ»Π΅Π΄ΡΡΡΠ΅Π΅:
void advance(std::list<int>::iterator& iter, int d)
{
if (typeid(std::iterator_traits<std::list<int>::iterator>::iterator_category)==
typeid(std::random_access_iterator_tag))
iter += d; // ΠΎΡΠΈΠ±ΠΊΠ°!
}
else {
if(d>=0) {while (dβ) ++iter;}
else {while(d++) βiter;}
}
}
ΠΡΠΎΠ±Π»Π΅ΠΌΠ° Π² Π²ΡΠ΄Π΅Π»Π΅Π½Π½ΠΎΠΉ ΡΡΡΠΎΠΊΠ΅, Π³Π΄Π΅ Π²ΡΡΡΠ΅ΡΠ°Π΅ΡΡΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡ +=. Π Π΄Π°Π½Π½ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ ΠΌΡ ΠΏΡΡΠ°Π΅ΠΌΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ += Π΄Π»Ρ ΡΠΈΠΏΠ° list<int>::iterator, Π½ΠΎ list<int>::iterator β ΡΡΠΎ Π΄Π²ΡΠ½Π°ΠΏΡΠ°Π²Π»Π΅Π½Π½ΡΠΉ ΠΈΡΠ΅ΡΠ°ΡΠΎΡ (ΡΠΌ. ΠΏΡΠ°Π²ΠΈΠ»ΠΎ 47), ΠΏΠΎΡΡΠΎΠΌΡ ΠΎΠ½ Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅Ρ +=. ΠΠΏΠ΅ΡΠ°ΡΠΎΡ += ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°ΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΠΈΡΠ΅ΡΠ°ΡΠΎΡΡ Ρ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ»ΡΠ½ΡΠΌ Π΄ΠΎΡΡΡΠΏΠΎΠΌ. ΠΡ Π·Π½Π°Π΅ΠΌ, ΡΡΠΎ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ ΠΏΠΎΠΏΡΡΠ°Π΅ΠΌΡΡ ΠΈΡΠΏΠΎΠ»Π½ΠΈΡΡ ΠΏΡΠ΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅, ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΠ΅Π΅ +=, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ Π΄Π»Ρ list<int>::iterator ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° Ρ ΠΏΡΠΈΠ²Π»Π΅ΡΠ΅Π½ΠΈΠ΅ΠΌ typeid Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ Π²ΡΠΏΠΎΠ»Π½ΠΈΡΡΡ ΡΡΠΏΠ΅ΡΠ½ΠΎ, Π½ΠΎ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡ-ΡΠΎ ΠΎΠ±ΡΠ·Π°Π½ Π³Π°ΡΠ°Π½ΡΠΈΡΠΎΠ²Π°ΡΡ, ΡΡΠΎ Π²Π΅ΡΡ ΠΈΡΡ ΠΎΠ΄Π½ΡΠΉ ΠΊΠΎΠ΄ ΠΊΠΎΡΡΠ΅ΠΊΡΠ΅Π½, Π΄Π°ΠΆΠ΅ Π΅ΡΠ»ΠΈ ΠΎΠ½ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ ΠΈΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ, Π° Β«iter += dΒ» β Π½Π΅ΠΊΠΎΡΡΠ΅ΠΊΡΠ½ΡΠΉ ΠΊΠΎΠ΄ Π² ΡΠ»ΡΡΠ°Π΅, ΠΊΠΎΠ³Π΄Π° iter Π½Π΅ ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΈΡΠ΅ΡΠ°ΡΠΎΡΠΎΠΌ Ρ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ»ΡΠ½ΡΠΌ Π΄ΠΎΡΡΡΠΏΠΎΠΌ. Π Π΅ΡΠ΅Π½ΠΈΠ΅ ΠΆΠ΅ Π½Π° ΠΎΡΠ½ΠΎΠ²Π΅ ΡΠ΅Ρ Π½ΠΎΠ»ΠΎΠ³ΠΈΠΈ TMP ΠΏΡΠ΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅Ρ, ΡΡΠΎ ΠΊΠΎΠ΄ Π΄Π»Ρ ΡΠ°Π·Π½ΡΡ ΡΠΈΠΏΠΎΠ² Π²ΡΠ½Π΅ΡΠ΅Π½ Π² ΡΠ°Π·Π½ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ, ΠΊΠ°ΠΆΠ΄Π°Ρ ΠΈΠ· ΠΊΠΎΡΠΎΡΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ, ΠΏΡΠΈΠΌΠ΅Π½ΠΈΠΌΡΠ΅ ΠΊ ΡΠΈΠΏΠ°ΠΌ, Π΄Π»Ρ ΠΊΠΎΡΠΎΡΡΡ ΠΎΠ½Π° Π½Π°ΠΏΠΈΡΠ°Π½Π°.
ΠΡΠ»ΠΎ Π΄ΠΎΠΊΠ°Π·Π°Π½ΠΎ, ΡΡΠΎ ΡΠ΅Ρ Π½ΠΎΠ»ΠΎΠ³ΠΈΡ TMP ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΠ΅Ρ ΡΠΎΠ±ΠΎΠΉ ΠΏΠΎΠ»Π½ΡΡ ΠΌΠ°ΡΠΈΠ½Ρ Π’ΡΡΡΠΈΠ½Π³Π°, ΡΠΎ Π΅ΡΡΡ ΠΎΠ±Π»Π°Π΄Π°Π΅Ρ Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎΠΉ ΠΌΠΎΡΡΡ Π΄Π»Ρ Π»ΡΠ±ΡΡ Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΠΉ. ΠΡΠΏΠΎΠ»ΡΠ·ΡΡ TMP, Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΎΠ±ΡΡΠ²Π»ΡΡΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅, Π²ΡΠΏΠΎΠ»Π½ΡΡΡ ΡΠΈΠΊΠ»Ρ, ΠΏΠΈΡΠ°ΡΡ ΠΈ Π²ΡΠ·ΡΠ²Π°ΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ ΠΈ Ρ. Π΄. ΠΠΎ ΡΠ°ΠΊΠΈΠ΅ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΈΠΈ Π²ΡΠ³Π»ΡΠ΄ΡΡ ΡΠΎΠ²Π΅ΡΡΠ΅Π½Π½ΠΎ ΠΈΠ½Π°ΡΠ΅, ΡΠ΅ΠΌ ΠΈΡ Π°Π½Π°Π»ΠΎΠ³ΠΈ ΠΈΠ· Β«Π½ΠΎΡΠΌΠ°Π»ΡΠ½ΠΎΠ³ΠΎΒ» C++. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, Π² ΠΏΡΠ°Π²ΠΈΠ»Π΅ 47 ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ, ΠΊΠ°ΠΊ Π² TMP ΡΡΠ»ΠΎΠ²Π½ΡΠ΅ ΠΏΡΠ΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΡ ifβ¦else Π²ΡΡΠ°ΠΆΠ°ΡΡΡΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΠ°Π±Π»ΠΎΠ½ΠΎΠ² ΠΈ ΠΈΡ ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΉ. ΠΠΎ ΡΠ°ΠΊΠΈΠ΅ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΈΠΈ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°Π·Π²Π°ΡΡ Β«TMP ΡΡΠΎΠ²Π½Ρ Π°ΡΡΠ΅ΠΌΠ±Π»Π΅ΡΠ°Β». Π Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ°Ρ Π΄Π»Ρ ΡΠ°Π±ΠΎΡΡ Ρ TMP (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, MPL ΠΈΠ· Boost β ΡΠΌ. ΠΏΡΠ°Π²ΠΈΠ»ΠΎ 55) ΠΏΡΠ΅Π΄Π»Π°Π³Π°Π΅ΡΡΡ Π±ΠΎΠ»Π΅Π΅ Π²ΡΡΠΎΠΊΠΎΡΡΠΎΠ²Π½Π΅Π²ΡΠΉ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡ, Ρ ΠΎΡΡ Π΅Π³ΠΎ ΡΠ°ΠΊΠΆΠ΅ Π½Π΅Π»ΡΠ·Ρ ΠΏΡΠΈΠ½ΡΡΡ Π·Π° Β«Π½ΠΎΡΠΌΠ°Π»ΡΠ½ΡΠΉΒ» Π‘++.
Π§ΡΠΎΠ±Ρ Π²Π·Π³Π»ΡΠ½ΡΡΡ Π½Π° TMP Ρ Π΄ΡΡΠ³ΠΎΠ³ΠΎ Π±ΠΎΠΊΡ, ΠΏΠΎΡΠΌΠΎΡΡΠΈΠΌ, ΠΊΠ°ΠΊ ΡΠ°ΠΌ Π²ΡΠ³Π»ΡΠ΄ΡΡ ΡΠΈΠΊΠ»Ρ. Π’Π΅Ρ Π½ΠΎΠ»ΠΎΠ³ΠΈΡ TMP Π½Π΅ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ Π½Π°ΡΡΠΎΡΡΠΈΡ ΡΠΈΠΊΠ»ΠΈΡΠ΅ΡΠΊΠΈΡ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΈΠΉ, ΠΏΠΎΡΡΠΎΠΌΡ ΡΠΈΠΊΠ» ΠΌΠΎΠ΄Π΅Π»ΠΈΡΡΠ΅ΡΡΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΠ΅ΠΊΡΡΡΠΈΠΈ. (ΠΡΠ»ΠΈ Π²Ρ Π½Π΅ ΠΎΡΠ΅Π½Ρ ΡΠ²Π΅ΡΠ΅Π½Π½ΠΎ Π²Π»Π°Π΄Π΅Π΅ΡΠ΅ ΡΠ΅ΠΊΡΡΡΠΈΠ΅ΠΉ, ΠΏΡΠΈΠ΄Π΅ΡΡΡ ΠΎΡΠ²ΠΎΠΈΡΡΡΡ Ρ Π½Π΅ΠΉ ΠΏΡΠ΅ΠΆΠ΄Π΅, ΡΠ΅ΠΌ ΠΏΡΠΈΡΡΡΠΏΠ°ΡΡ ΠΊ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ TMP. ΠΠ΅Π΄Ρ TMP β ΠΏΠΎ ΡΡΡΠ΅ΡΡΠ²Ρ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΡΠ½ΡΠΉ ΡΠ·ΡΠΊ, Π° Π΄Π»Ρ ΡΠ°ΠΊΠΈΡ ΡΠ·ΡΠΊΠΎΠ² ΡΠ΅ΠΊΡΡΡΠΈΡ β ΡΠΎ ΠΆΠ΅, ΡΡΠΎ ΡΠ΅Π»Π΅Π²ΠΈΠ΄Π΅Π½ΠΈΠ΅ Π΄Π»Ρ Π°ΠΌΠ΅ΡΠΈΠΊΠ°Π½ΡΠΊΠΎΠΉ ΠΏΠΎΠΏ-ΠΊΡΠ»ΡΡΡΡΡ β Π½Π΅ΠΎΡΡΠ΅ΠΌΠ»Π΅ΠΌΠ°Ρ ΠΏΡΠΈΠ½Π°Π΄Π»Π΅ΠΆΠ½ΠΎΡΡΡ.) ΠΠΎ ΠΈ ΡΠ΅ΠΊΡΡΡΠΈΡ-ΡΠΎ Π½Π΅ ΡΠΎΠ²ΡΠ΅ΠΌ ΠΎΠ±ΡΡΠ½Π°Ρ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΏΡΠΈ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΡΠΈΠΊΠ»ΠΎΠ² TMP Π½Π΅Ρ ΡΠ΅ΠΊΡΡΡΠΈΠ²Π½ΡΡ Π²ΡΠ·ΠΎΠ²ΠΎΠ² ΡΡΠ½ΠΊΡΠΈΠΉ, Π° Π΅ΡΡΡ ΡΠ΅ΠΊΡΡΡΠΈΠ²Π½ΡΠ΅ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠΈΠ·Π°ΡΠΈΠΈ ΡΠ°Π±Π»ΠΎΠ½ΠΎΠ².
ΠΠ½Π°Π»ΠΎΠ³ΠΎΠΌ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ Β«Hello WorldΒ» Π½Π° TMP ΡΠ²Π»ΡΠ΅ΡΡΡ Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΠ΅ ΡΠ°ΠΊΡΠΎΡΠΈΠ°Π»Π° Π²ΠΎ Π²ΡΠ΅ΠΌΡ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΈΠΈ. ΠΠΎΠ½Π΅ΡΠ½ΠΎ, ΠΎΠ½Π°, ΠΊΠ°ΠΊ ΠΈ Β«Hello WorldΒ», Π½Π΅ ΠΏΠΎΡΠ°Π·ΠΈΡ Π²ΠΎΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅, Π½ΠΎ ΠΎΠ±Π΅ ΠΏΠΎΠ»Π΅Π·Π½Ρ Π΄Π»Ρ Π΄Π΅ΠΌΠΎΠ½ΡΡΡΠ°ΡΠΈΠΈ Π±Π°Π·ΠΎΠ²ΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠ΅ΠΉ ΡΠ·ΡΠΊΠ°. ΠΡΡΠΈΡΠ»Π΅Π½ΠΈΠ΅ ΡΠ°ΠΊΡΠΎΡΠΈΠ°Π»Π° Ρ ΠΏΠΎΠΌΠΎΡΡΡ TMP ΡΠ²ΠΎΠ΄ΠΈΡΡΡ ΠΊ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ ΡΠ΅ΠΊΡΡΡΠΈΠ²Π½ΡΡ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠΈΠ·Π°ΡΠΈΠΉ ΡΠ°Π±Π»ΠΎΠ½Π°. ΠΡΠΎΠΌΠ΅ ΡΠΎΠ³ΠΎ, Π΄Π΅ΠΌΠΎΠ½ΡΡΡΠΈΡΡΠ΅ΡΡΡ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· ΡΠΏΠΎΡΠΎΠ±ΠΎΠ² ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ Π² TMP. Π‘ΠΌΠΎΡΡΠΈΡΠ΅:
template<unsigned n> // ΠΎΠ±ΡΠΈΠΉ ΡΠ»ΡΡΠ°ΠΉ: Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Factorial<n> β ΡΡΠΎ
struct Factorial { // ΠΏΡΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½ΠΈΠ΅ n ΠΈ Factorial<n-1>
enum { value = n*Factorial<n-1>::value };
};
template<> // ΡΠ°ΡΡΠ½ΡΠΉ ΡΠ»ΡΡΠ°ΠΉ: Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Factorial<0> β
struct Factorial<0> { // ΡΡΠΎ 1
enum { value = 1 };
};
ΠΠΌΠ΅Ρ ΡΠ°ΠΊΡΡ ΡΠ°Π±Π»ΠΎΠ½Π½ΡΡ ΠΌΠ΅ΡΠ°ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ (Π½Π° ΡΠ°ΠΌΠΎΠΌ Π΄Π΅Π»Π΅ ΠΏΡΠΎΡΡΠΎ Π΅Π΄ΠΈΠ½ΡΡΠ²Π΅Π½Π½ΡΡ ΡΠ°Π±Π»ΠΎΠ½Π½ΡΡ ΠΌΠ΅ΡΠ°ΡΡΠ½ΠΊΡΠΈΡ Factorial), Π²Ρ ΠΏΠΎΠ»ΡΡΠ°Π΅ΡΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΡΠ°ΠΊΡΠΎΡΠΈΠ°Π»Π° n, ΠΎΠ±ΡΠ°ΡΠ°ΡΡΡ ΠΊ Factorial<n>::value.
Π¦ΠΈΠΊΠ»ΠΈΡΠ΅ΡΠΊΠ°Ρ ΡΠ°ΡΡΡ ΠΊΠΎΠ΄Π° Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ ΡΠ°ΠΌ, Π³Π΄Π΅ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠΈΠ·Π°ΡΠΈΡ ΡΠ°Π±Π»ΠΎΠ½Π° Factorial<n> ΡΡΡΠ»Π°Π΅ΡΡΡ Π½Π° ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠΈΠ·Π°ΡΠΈΡ ΡΠ°Π±Π»ΠΎΠ½Π° Factorial<n-1>. ΠΠ°ΠΊ Π²ΠΎ Π²ΡΡΠΊΠΎΠΉ ΡΠ΅ΠΊΡΡΡΠΈΠ²Π½ΠΎΠΉ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ΅, Π·Π΄Π΅ΡΡ Π΅ΡΡΡ ΠΎΡΠΎΠ±ΡΠΉ ΡΠ»ΡΡΠ°ΠΉ, ΠΏΡΠ΅ΠΊΡΠ°ΡΠ°ΡΡΠΈΠΉ ΡΠ΅ΠΊΡΡΡΠΈΡ. Π Π΄Π°Π½Π½ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ ΡΡΠΎ ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ ΡΠ°Π±Π»ΠΎΠ½Π° Factorial<0>.