
рдкрд┐рдЫрд▓реЗ рднрд╛рдЧреЛрдВ рдХрд╛ рд╕рд╛рд░рд╛рдВрд╢
рд╕реА ++ 11 рд╕рдВрдХрд▓рдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдкрд░ рдкреНрд░рддрд┐рдмрдВрдз рдХреЗ рдХрд╛рд░рдг, рдФрд░ рд╡реИрдХрд▓реНрдкрд┐рдХрддрд╛ рдХреА рдХрдореА рд╕реЗ, рдмреВрд╕реНрдЯрд░ рдиреЗ рд╕рдВрдХрд▓рдХ рдХреЗ рд╕рд╛рде рдЖрдкреВрд░реНрддрд┐ рдХреА рдЧрдИ C ++ 98 / C ++ 03 рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рдорд╛рдирдХ C ++ 11 рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рдЕрдкрдиреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рд▓рд┐рдЦрдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ред
Static_assert ,
noexcept ,
countof рдХреЛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдФрд░ рдпрд╣ рднреА, рд╕рднреА рдЧреИрд░-рдорд╛рдирдХ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдФрд░ рд╕рдВрдХрд▓рдХ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдЬрд╛рдирдХрд╛рд░реА рдЙрд╕ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреА рдЬреЛ рд╡рд░реНрддрдорд╛рди рд╕рдВрдХрд▓рдХ рджреНрд╡рд╛рд░рд╛ рд╕рдорд░реНрдерд┐рдд рд╣реИред
рдирд▓реНрдЯрд░ рдХрд╛ рдЕрдкрдирд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди
рд╢рд╛рдорд┐рд▓ рд╣реИ , рдЬрд┐рд╕реЗ рд╕рдВрдХрд▓рди рдЪрд░рдг рдореЗрдВ рдЪреБрдирд╛ рдЧрдпрд╛ рд╣реИред
рдЯрд╛рдЗрдк_рдЯреНрд░реЗрдЯреНрд╕ рдФрд░ рдЗрд╕ "рд╡рд┐рд╢реЗрд╖ рдЯреЗрдореНрдкрд▓реЗрдЯ рдореИрдЬрд┐рдХ" рдХрд╛ рд╕рдордп рдЖ рдЧрдпрд╛ рд╣реИред рдЗрд╕ рдЕрдзреНрдпрд╛рдп рдХреЗ рдкрд┐рдЫрд▓реЗ рднрд╛рдЧреЛрдВ рдореЗрдВ, рд╣рдордиреЗ рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рдмреБрдирд┐рдпрд╛рджреА рдЯреЗрдореНрдкрд▓реЗрдЯреНрд╕ рдХреЗ рдореЗрд░реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рдЬрд╛рдВрдЪ рдХреА, рдФрд░ рдЗрд╕ рднрд╛рдЧ рдореЗрдВ рд╣рдо SFINAE рддрдХрдиреАрдХ рдХреЗ рд╕рдВрдпреЛрдЬрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реЗрдВрдЧреЗ, рдЬрд┐рд╕рдореЗрдВ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдФрд░ рдХреЛрдб рдкреАрдврд╝реА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдереЛрдбрд╝реА рдЬрд╛рдирдХрд╛рд░реА рд╣реЛрдЧреАред
рдмреЗрд╕рдмреНрд░реА рдФрд░ рдЧреИрд░-рдкрд╛рдардХреЛрдВ рдХреЗ рд▓рд┐рдП рдЖрдЬ рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреЗ рд╕рд╛рде GitHub рдХреЛ рд▓рд┐рдВрдХ рдХрд░реЗрдВ:
рдХрдорд┐рдЯ рдФрд░ рд░рдЪрдирд╛рддреНрдордХ рдЖрд▓реЛрдЪрдирд╛ рдХрд╛ рд╕реНрд╡рд╛рдЧрдд рд╣реИ
рдмрд┐рд▓реНрд▓реА рдХреЗ рдиреАрдЪреЗ рдЕрдзрд┐рдХ рд╕реА ++ рдЯреЗрдореНрдкрд▓реЗрдЯреНрд╕ред
рд╕рд╛рдордЧреНрд░реА рдХреА рддрд╛рд▓рд┐рдХрд╛
рдкрд░рд┐рдЪрдпрдЕрдзреНрдпрд╛рдп 1. рд╡реАрдЖрдИрдПрдо рдкрд░реНрдпрд╡реЗрдХреНрд╖рдХ рд╡рдбреЗрдВрд╕рдЕрдзреНрдпрд╛рдп 2. #ifndef __CPP11_SUPPORT__ #define __COMPILER_SPECIFIC_BUILT_IN_AND_MACRO_HELL__ #endifрдЕрдзреНрдпрд╛рдп 3. рд╕рд╣реА nullptr рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдвреВрдБрдврдирд╛рдЕрдзреНрдпрд╛рдп 4. рд╕реА ++ рдЯреЗрдореНрдкрд▓реЗрдЯ рдореИрдЬрд┐рдХ....
рек.рез рд╣рдо рдЫреЛрдЯреЗ рд╕реЗ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ....
рек.реи рд╣рдорд╛рд░реЗ рдмрд╛рд░реЗ рдореЗрдВ рдХрд┐рддрдиреА рдЪрдорддреНрдХрд╛рд░реА рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХрд╛ рд╕рдВрдХрд▓рди рдХрд░рддрд╛ рд╣реИ....
рек.рей рдкреЙрдЗрдВрдЯрд░реНрд╕ рдФрд░ рдСрд▓-рдСрд▓-рдСрд▓....
4.4 рдЯреЗрдореНрдкреНрд▓реЗрдЯ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рд▓рд┐рдП рдФрд░ рдХреНрдпрд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИрдЕрдзреНрдпрд╛рдп 5
...
рдЕрдзреНрдпрд╛рдп 4. рдЯреЗрдореНрдкрд▓реЗрдЯ "рдЬрд╛рджреВ" рд╕реА ++ред рд╡рд┐рд╕реНрддрд╛рд░
4.3 рдкреЙрдЗрдВрдЯ рдФрд░ рдСрд▓-рдСрд▓-рдСрд▓
рдЗрд╕ рд╕реНрддрд░ рдкрд░, рдореБрдЭреЗ рдХреЗрд╡рд▓ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдорд┐рд▓ рд╕рдХреА рдХрд┐ рдХреНрдпрд╛ рдкреНрд░рдХрд╛рд░
std :: is_array рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд░рдгреА рд╣реИ рдФрд░ рд╕рдВрдХреЗрдд рдХреЗ рд▓рд┐рдП рдЯреЗрдореНрдкрд▓реЗрдЯ рд╢реБрд░реВ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИред рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рднреА рддреБрдЪреНрдЫ рдерд╛, рд▓реЗрдХрд┐рди рдорд╛рдиреНрдпрддрд╛рдУрдВ рдХреЗ рдмрд┐рдирд╛ рдирд╣реАрдВред
рдХрд┐рд╕реА рджрд┐рдП рдЧрдП рд▓рдВрдмрд╛рдИ рдХреЗ рд╕рд░рдгрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд░рд▓ рдЯреЗрдореНрдкрд▓реЗрдЯ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛, рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд░рдгрд┐рдпреЛрдВ рдХреЛ "рдкрдХрдбрд╝рддрд╛" рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╕рдорд╕реНрдпрд╛ рдЕрдкреВрд░реНрдг рдкреНрд░рдХрд╛рд░
рдЯреА [] (рд▓рдВрдмрд╛рдИ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдП рдмрд┐рдирд╛ рдПрдХ рд╕рд░рдгреА) рдХреЗ рд╕рд╛рде рдЙрддреНрдкрдиреНрди рд╣реЛрддреА рд╣реИред рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЛ рдХреБрдЫ рдХрдВрдкрд╛рдЗрд▓рд░реЛрдВ (рд╕реА ++ рдмрд┐рд▓реНрдбрд░) рджреНрд╡рд╛рд░рд╛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдЬрдм рдПрдХ рдЯреЗрдореНрдкрд▓реЗрдЯ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рд╣реИ, рдФрд░ рдореБрдЭреЗ рдЕрднреА рддрдХ рдпрд╣рд╛рдВ рдПрдХ рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рдорд┐рд▓рд╛ рд╣реИред
рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЛ "рд╕рд┐рдЦрд╛рдпрд╛" рдЧрдпрд╛ рдерд╛ рддрд╛рдХрд┐ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд╕рдордп рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗ, рдЯрд╛рдЗрдк рдореЗрдореЛрд░реА рдореЗрдВ рд╕рдВрд░реЗрдЦрдг, рд╕рдВрдХрд▓рди рд╕рдордп рдкрд░ рдЯреЗрдореНрдкрд▓реЗрдЯреНрд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкреНрд░рдХрд╛рд░ рд╕рдВрд╢реЛрдзрдХ рдФрд░ рдЕрдиреНрдп рдмреБрдирд┐рдпрд╛рджреА рдЪреАрдЬреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛, рдпрд╣ рд╕рдВрдХреЗрдд рдФрд░ рд╕рдВрджрд░реНрдн рдХреЗ рд▓рд┐рдП рд╕рдордп рдерд╛ред

рд╕реА ++ рдореЗрдВ, рдкреЙрдЗрдВрдЯрд░реНрд╕ рдХреЗ рджреЛ рд╕рдореВрд╣реЛрдВ рдХреЛ рдкреНрд░рддрд┐рд╖реНрдард┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ - рдХреНрд▓рд╛рд╕ рдХреЗ рд╕рджрд╕реНрдпреЛрдВ рдФрд░ рдкреЙрдЗрдВрдЯрд░реНрд╕ рдХреЛ рдЕрдиреНрдп рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЗ рд▓рд┐рдП рдкреЙрдЗрдВрдЯрд░реНрд╕ред рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рдЖрдЧреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рдпрд╣ рдЕрд▓рдЧрд╛рд╡ рдХреНрдпреЛрдВ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ? рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдХрдХреНрд╖рд╛ рд╕рджрд╕реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдВрдХреЗрдд рдЕрдиреНрдп рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд┐рдВрджреБрдУрдВ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЕрдВрддрд░ рд╣реИ, рдЕрд░реНрдерд╛рддред рдЗрд╕ рд╡рд░реНрдЧ рдХреА рдХрд┐рд╕реА рд╡рд╕реНрддреБ рдХрд╛ рд╕реВрдЪрдХред рдФрд░ рдорд╛рдирдХ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдПрдХ рд╡рд░реНрдЧ рдХреЗ рд╕рджрд╕реНрдп рдХреЗ рдмрд┐рдВрджреБрдУрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рд╣реИ, рдПрдХ рдЕрд▓рдЧ рдкреНрд░рдХрд╛рд░ рд╣реИ, рдФрд░ рдПрдХ рдирд┐рдпрдорд┐рдд рд╕реВрдЪрдХ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ, рдпрд╣ рдЗрд╕ рддрдереНрдп рдореЗрдВ рддрдмреНрджреАрд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдХрдХреНрд╖рд╛ рдХреЗ рд╕рджрд╕реНрдп рдХреЗ рд▓рд┐рдП рд╕реВрдЪрдХ рдХрд╛ рдЖрдХрд╛рд░ рдЖрдорддреМрд░ рдкрд░ рдПрдХ рдирд┐рдпрдорд┐рдд рд╕реВрдЪрдХ рдХреЗ рдЖрдХрд╛рд░ (рдЬреЛ
== sizeof (рд╢реВрдиреНрдп *) ) рд╕реЗ рдмрдбрд╝рд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдХрдХреНрд╖рд╛ рдХреЗ рдЖрднрд╛рд╕реА рд╕рджрд╕реНрдп рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╕рд╛рде рд╣реА рд╕рд╛рде
рдЗрд╕ рд╕реВрдЪрдХ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╕рдВрдХрд▓рдХ рдЖрдорддреМрд░ рдкрд░ рдХрдХреНрд╖рд╛ рд╕рджрд╕реНрдп рдХреЛ рд╕рдВрд░рдЪрдирд╛ (рд╡рд░реНрдЪреБрдЕрд▓ рдХрд╛рд░реНрдпреЛрдВ рдФрд░
рд╕рдВрд░рдЪрдирд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрдврд╝реЗрдВ) рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдВрдХреЗрдд рджреЗрддреЗ рд╣реИрдВред рд╕рдВрдХрд▓рдХ рдХреЗ рд╡рд┐рд╡реЗрдХ рдкрд░, рдорд╛рдирдХ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдХрдХреНрд╖рд╛ рд╕рджрд╕реНрдпреЛрдВ рдХреЛ рд╕рдВрдХреЗрдд рдкреНрд░рд╕реНрддреБрдд рдХрд░рдиреЗ рдХрд╛ рддрд░реАрдХрд╛ рдмрдЪрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдо рдЖрдЧреЗ рдХреЗ рдХреЛрдб рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рддреЗ рд╕рдордп рдЖрдХрд╛рд░ рдФрд░ рдкреНрд░рд╕реНрддреБрддрд┐ рдореЗрдВ рдЗрд╕ рдЕрдВрддрд░ рдХреЛ рдпрд╛рдж рд░рдЦреЗрдВрдЧреЗред
рдХрд┐рд╕реА рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП рдПрдХ рдирд┐рдпрдорд┐рдд рдкреЙрдЗрдВрдЯрд░ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдПрдХ рд╕рд╛рдзрд╛рд░рдг
is_pointer рдЯреЗрдореНрдкреНрд▓реЗрдЯ
рд▓рд┐рдЦреЗрдВрдЧреЗ , рд╕рд╛рде рд╣реА рдСрдмреНрдЬреЗрдХреНрдЯ рд░реЗрдлрд░реЗрдВрд╕ рдХреЗ рд▓рд┐рдП рдПрдХ
is_lvalue_reference рдЯреЗрдореНрдкреНрд▓реЗрдЯ (
рд╣рдо is_rvalue_reference рдХреЛ
рдЕрд▓рдЧ рдХрд░рддреЗ рд╣реИрдВ , рдХреНрдпреЛрдВрдХрд┐ 11 рд╡реАрдВ рдХрдХреНрд╖рд╛ рддрдХ рдХреЛрдИ
рдФрд░& рдСрдкрд░реЗрдЯрд░ рдХреЗ рд╕рд╛рде-рд╕рд╛рде рдкреВрд░реЗ рдореВрд╡ рд╢рдмреНрджрд╛рд░реНрде рднреА рдирд╣реАрдВ рдереЗ):
namespace detail { template<class> struct _is_pointer_helper : public false_type { }; template<class _Tp> struct _is_pointer_helper<_Tp*> : public true_type { }; }
рдпрд╣рд╛рдВ рдЕрдм рдореМрд▓рд┐рдХ рд░реВрдк рд╕реЗ рдирдпрд╛ рдХреБрдЫ рднреА рдирд╣реАрдВ рд╣реИ, рдпрд╣ рд╕рдм рдЗрд╕ рдЕрдзреНрдпрд╛рдп рдХреЗ рдкрд┐рдЫрд▓реЗ рд╣рд┐рд╕реНрд╕реЛрдВ рдореЗрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдЖрдЗрдП рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдкреЙрдЗрдВрдЯрд░реНрд╕ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦреЗрдВ - рдЕрдм рдЖрдЗрдП рдкреЙрдЗрдВрдЯрд░реНрд╕ рдЯреВ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреЛ рджреЗрдЦреЗрдВред
рдпрд╣ рд╕рдордЭрдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдФрд░ рдПрдХ рд╡рд░реНрдЧ рдХрд╛ рд╕рджрд╕реНрдп рдлрд╝рдВрдХреНрд╢рди рдорд╛рдирдХ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд▓рдЧ рд╕рдВрд╕реНрдерд╛рдПрдВ рд╣реИрдВ:
- рдкрд╣рд▓рд╛ рдкреЙрдЗрдВрдЯрд░ рд╕рд╛рдорд╛рдиреНрдп (рдХрд┐рд╕реА рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рдкреЙрдЗрдВрдЯрд░) рд╣реЛрдЧрд╛, рджреВрд╕рд░реЗ рдореЗрдВ рдХреНрд▓рд╛рд╕ рдХреЗ рд╕рджрд╕реНрдп рдХрд╛ рдкреЙрдЗрдВрдЯрд░ рд╣реЛрдЧрд╛ред
void (*func_ptr)(int);
- рдЖрдк рдкрд╣рд▓реА (рдСрдмреНрдЬреЗрдХреНрдЯ рд▓рд┐рдВрдХ) рдХреЗ рд▓рд┐рдП рдПрдХ рд▓рд┐рдВрдХ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЖрдк рджреВрд╕рд░рд╛ рд▓рд┐рдВрдХ рдирд╣реАрдВ рдмрдирд╛ рд╕рдХрддреЗред
void (&func_ref)(int);
рдпрд╣рд╛рдБ рдореИрдВ рдХреЛрдб рдкреАрдврд╝реА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдереЛрдбрд╝рд╛ рд╕рд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд░реВрдБрдЧрд╛ред рдЪреВрдВрдХрд┐ C ++ 11 рдореЗрдВ рдорд╛рдкрджрдВрдбреЛрдВ рдХреА рдПрдХ рдЪрд░ рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд╕рд╛рде рдХреЛрдИ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдирд╣реАрдВ рдереЗ, рдЗрд╕рд▓рд┐рдП рд╕рднреА рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдЬрд╣рд╛рдВ рдкреИрд░рд╛рдореАрдЯрд░ рдХреА рдПрдХ рдЕрд▓рдЧ рд╕рдВрдЦреНрдпрд╛ рд╣реЛ рд╕рдХрддреА рдереА
, рдЙрдиреНрд╣реЗрдВ рдореБрдЦреНрдп рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдХреЗ рдХрд┐рд╕реА рднреА рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд╕рд╛рде рдЗрдирдкреБрдЯ рдФрд░ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдбрдореА рдорд╛рдкрджрдВрдбреЛрдВ рджреНрд╡рд╛рд░рд╛ рдЙрдирдХреЗ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдХреЗ
рдорд╛рдзреНрдпрдо рд╕реЗ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдПрдХ рд╣реА рдмрд╛рдд рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдп рдЕрдзрд┐рднрд╛рд░, рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдорд╛рдкрджрдВрдбреЛрдВ рдХреА рдПрдХ рдЪрд░ рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд╕рд╛рде рдХреЛрдИ рдореИрдХреНрд░реЛрдЬрд╝ рдирд╣реАрдВ рдереЗред рдЕрдкрдиреЗ рд╣рд╛рдереЛрдВ рд╕реЗ рдПрдХ рд╣реА рдкреНрд░рдХрд╛рд░ рдХреЗ рдЯреЗрдореНрдкрд▓реЗрдЯ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛рдУрдВ рдХреА 60-70 рдкрдВрдХреНрддрд┐рдпрд╛рдВ рд▓рд┐рдЦрдиреЗ рдХреЗ рдмрд╛рдж, рдУрд╡рд░рд▓реЛрдбрд┐рдВрдЧ рдлрд╝рдВрдХреНрд╢рди рдПрдХ рд╕реБрд╕реНрдд рдФрд░ рдмреЗрдХрд╛рд░ рдХрд╛рдо рд╣реИ, рдФрд░ рдпрд╣ рднреА рдЧрд▓рддреА рдХрд░рдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рд╕реЗ рднрд░рд╛ рд╣реИред рдореИрдВрдиреЗ рдЗрди рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдХреЛрдб рдФрд░ рдлрд╝рдВрдХреНрд╢рди рдУрд╡рд░рд▓реЛрдбреНрд╕ рдХреЗ рд▓рд┐рдП рдХреЛрдб рдХрд╛ рдПрдХ рд╕рд░рд▓ рдЬрдирд░реЗрдЯрд░ рд▓рд┐рдЦрд╛ рд╣реИред рдореИрдВрдиреЗ рдЕрдкрдиреЗ рдЖрдк рдХреЛ 24 рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реАрдорд┐рдд рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ рдФрд░ рдпрд╣ рдХреЛрдб рдореЗрдВ рдмреЛрдЭрд┐рд▓ рд▓рдЧ рд░рд╣рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╕рд░рд▓ рдФрд░ рд╕реНрдкрд╖реНрдЯ:
namespace detail { template <class R> struct _is_function_ptr_helper : false_type {}; template <class R > struct _is_function_ptr_helper<R(*)()> : true_type {}; template <class R > struct _is_function_ptr_helper<R(*)(...)> : true_type {}; template <class R, class T0> struct _is_function_ptr_helper<R(*)(T0)> : true_type {}; template <class R, class T0> struct _is_function_ptr_helper<R(*)(T0 ...)> : true_type {};
... template <class R, class T0, class T1, class T2, class T3, class T4, class T5, class T6, class T7, class T8, class T9, class T10, class T11, class T12, class T13, class T14, class T15, class T16, class T17, class T18, class T19, class T20, class T21, class T22, class T23, class T24> struct _is_function_ptr_helper<R(*)(T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24)> : true_type {}; template <class R, class T0, class T1, class T2, class T3, class T4, class T5, class T6, class T7, class T8, class T9, class T10, class T11, class T12, class T13, class T14, class T15, class T16, class T17, class T18, class T19, class T20, class T21, class T22, class T23, class T24> struct _is_function_ptr_helper<R(*)(T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24 ...)> : true_type {}; }
рд╣рдо SFINAE рддрдХрдиреАрдХ рдХреЗ рд▓рд┐рдП рдкрд┐рдЫрд▓реЗ рдЕрдзреНрдпрд╛рдп рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ:
namespace detail {
рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдФрд░ рдореИрдХреНрд░реЛрдЬрд╝ namespace detail { #define _IS_MEM_FUN_PTR_CLR \ template <class R, class T TYPES > \ _yes_type _is_mem_function_ptr(R(T::*const volatile*)(ARGS)); \ template <class R, class T TYPES > \ _yes_type _is_mem_function_ptr(R(T::*const volatile*)(ARGS...)); \ template <class R, class T TYPES > \ _yes_type _is_mem_function_ptr(R(T::*const volatile*)(ARGS) const); \ template <class R, class T TYPES > \ _yes_type _is_mem_function_ptr(R(T::*const volatile*)(ARGS) volatile); \ template <class R, class T TYPES > \ _yes_type _is_mem_function_ptr(R(T::*const volatile*)(ARGS) const volatile); \ template <class R, class T TYPES > \ _yes_type _is_mem_function_ptr(R(T::*const volatile*)(ARGS...) const); \ template <class R, class T TYPES > \ _yes_type _is_mem_function_ptr(R(T::*const volatile*)(ARGS...) volatile); \ template <class R, class T TYPES > \ _yes_type _is_mem_function_ptr(R(T::*const volatile*)(ARGS...) const volatile); #ifdef _STDEX_CDECL _no_type _STDEX_CDECL _is_mem_function_ptr(...); #define _IS_MEM_FUN_CDECL_PTR \ template <class R, class T TYPES > \ _yes_type _is_mem_function_ptr(R(__cdecl T::*const volatile*)(ARGS)); \ template <class R, class T TYPES > \ _yes_type _is_mem_function_ptr(R(__cdecl T::*const volatile*)(ARGS) const); \ template <class R, class T TYPES > \ _yes_type _is_mem_function_ptr(R(__cdecl T::*const volatile*)(ARGS) volatile); \ template <class R, class T TYPES > \ _yes_type _is_mem_function_ptr(R(__cdecl T::*const volatile*)(ARGS) const volatile); #define _IS_MEM_FUN_STDCALL_PTR \ template <class R, class T TYPES > \ _yes_type _is_mem_function_ptr(R(__stdcall T::*const volatile*)(ARGS)); \ template <class R, class T TYPES > \ _yes_type _is_mem_function_ptr(R(__stdcall T::*const volatile*)(ARGS) const); \ template <class R, class T TYPES > \ _yes_type _is_mem_function_ptr(R(__stdcall T::*const volatile*)(ARGS) volatile); \ template <class R, class T TYPES > \ _yes_type _is_mem_function_ptr(R(__stdcall T::*const volatile*)(ARGS) const volatile); #define _IS_MEM_FUN_FASTCALL_PTR \ template <class R, class T TYPES > \ _yes_type _is_mem_function_ptr(R(__fastcall T::*const volatile*)(ARGS)); \ template <class R, class T TYPES > \ _yes_type _is_mem_function_ptr(R(__fastcall T::*const volatile*)(ARGS) const); \ template <class R, class T TYPES > \ _yes_type _is_mem_function_ptr(R(__fastcall T::*const volatile*)(ARGS) volatile); \ template <class R, class T TYPES > \ _yes_type _is_mem_function_ptr(R(__fastcall T::*const volatile*)(ARGS) const volatile); #else _no_type _is_mem_function_ptr(...); #define _IS_MEM_FUN_CDECL_PTR #define _IS_MEM_FUN_STDCALL_PTR #define _IS_MEM_FUN_FASTCALL_PTR #endif #define _IS_MEM_FUN_PTR \ _IS_MEM_FUN_PTR_CLR \ _IS_MEM_FUN_CDECL_PTR \ _IS_MEM_FUN_STDCALL_PTR \ _IS_MEM_FUN_FASTCALL_PTR }
рдореИрдХреНрд░реЛрдЬрд╝ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рддрд╛рдХрд┐ рдпрд╣
TYPES рдХреЛ рдлрд┐рд░ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реЛ рдФрд░
ARGS рдкреНрд░рдХрд╛рд░ рдФрд░ рдорд╛рдкрджрдВрдбреЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рдХреЗ рд░реВрдк рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдлрд┐рд░ рдкреНрд░реАрдкреНрд░реЛрд╕реЗрд╕рд░ рджреНрд╡рд╛рд░рд╛ рд╕рднреА рд╕рдВрднрд╛рд╡рд┐рдд рдлрд╝рдВрдХреНрд╢рди рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдкрд░рд┐рднрд╛рд╖рд╛ рдЙрддреНрдкрдиреНрди
рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП
_IS_MEM_FUN_PTR рдореИрдХреНрд░реЛ
рдХреЛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рдЗрд╕ рддрдереНрдп рдкрд░ рднреА рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ Microsoft рдХреЗ
рдХрдВрдкрд╛рдЗрд▓рд░реЛрдВ рдХреЗ рд▓рд┐рдП ,
рдХреЙрд▓ рдПрдЧреНрд░реАрдореЗрдВрдЯреНрд╕ (
__fastcall ,
__stdcall рдФрд░
__cdecl ) рднреА
рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИрдВ , рдХреНрдпреЛрдВрдХрд┐ рд╡рд┐рднрд┐рдиреНрди рд╕рдореНрдореЗрд▓рдиреЛрдВ рдХреЗ рд╕рд╛рде, рдлрд╝рдВрдХреНрд╢рдВрд╕ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╣реЛрдВрдЧреЗ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЙрдирдХреЗ рдкрд╛рд╕ рддрд░реНрдХреЛрдВ рдФрд░ рд╡рд╛рдкрд╕реА рдореВрд▓реНрдп рдХрд╛ рдПрдХ рд╣реА рд╕реЗрдЯ рд╣реИред рдирддреАрдЬрддрди, рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рднрд╡реНрдп рдореИрдХреНрд░реЛ рдбрд┐рдЬрд╛рдЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд╛рдлреА рдХреЙрдореНрдкреИрдХреНрдЯ рд░реВрдк рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
namespace detail { #define TYPES #define ARGS _IS_MEM_FUN_PTR #undef TYPES #undef ARGS #define TYPES , class T0 #define ARGS T0 _IS_MEM_FUN_PTR #undef TYPES #undef ARGS #define TYPES , class T0, class T1 #define ARGS T0, T1 _IS_MEM_FUN_PTR #undef TYPES #undef ARGS
... #define TYPES , class T0, class T1, class T2, class T3, class T4, class T5, class T6, class T7, class T8, class T9, class T10, class T11, class T12, class T13, class T14, class T15, class T16, class T17, class T18, class T19, class T20, class T21, class T22, class T23, class T24 #define ARGS T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24 _IS_MEM_FUN_PTR #undef TYPES #undef ARGS
рдФрд░ рдЕрдм рдпрд╣ рд╕рдм рдХреНрдпрд╛ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдерд╛:
namespace detail { template <class _Tp, bool _IsRef> struct _is_mem_function_ptr_impl { static _Tp *p; static const bool value = (sizeof(_is_mem_function_ptr(_is_mem_function_ptr_impl::p)) == sizeof(_yes_type)); typedef typename integral_constant<bool, _is_mem_function_ptr_impl::value == bool(true)>::type type; }; template <class _Tp> struct _is_mem_function_ptr_impl<_Tp, true>: public false_type {}; template <class _Tp> struct _is_mem_function_ptr_helper: public _is_mem_function_ptr_impl<_Tp, is_reference<_Tp>::value>::type {}; template <class _Tp, bool _IsMemberFunctionPtr> struct _is_function_chooser_impl : public false_type { }; template <class _Tp> struct _is_function_chooser_impl<_Tp, false> : public _is_function_ptr_helper<_Tp*> { }; template<class _Tp, bool _IsRef = true> struct _is_function_chooser : public false_type { }; template <class _Tp> struct _is_function_chooser<_Tp, false> { static const bool value = _is_function_chooser_impl<_Tp, _is_mem_function_ptr_helper<_Tp>::value>::value; }; }
рдпрд╣ рдЬрд╛рдБрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдПрдХ рдкреНрд░рдХрд╛рд░ рдПрдХ рд╡рд░реНрдЧ рдХрд╛ рд╕рджрд╕реНрдп рдХрд╛рд░реНрдп рд╣реИ, рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╣рд▓реЗ рдЬрд╛рдБрдЪ рдХреА рдЬрд╛рддреА рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдкреНрд░рдХрд╛рд░ рдПрдХ рд╕рдВрджрд░реНрдн рд╣реИред рдлрд┐рд░ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рдПрдХ рдкреЙрдЗрдВрдЯрд░ рдХреЛ рдЬрд╛рдВрдЪ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдмрдирд╛рдпрд╛ рдФрд░ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред SFINAE рддрдХрдиреАрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рдХрдВрдкрд╛рдЗрд▓рд░ рдРрд╕реЗ рдкреЙрдЗрдВрдЯрд░ рдХреЗ рд▓рд┐рдП рдЬрд╛рдВрдЪ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдЖрд╡рд╢реНрдпрдХ рдЕрдзрд┐рднрд╛рд░ рдХрд╛ рдЪрдпрди рдХрд░рддрд╛ рд╣реИ рдФрд░
_yes_type рдХреЗ рд╕рд╛рде рддреБрд▓рдирд╛ рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдкрд░рд┐рдгрд╛рдо рдмрдирд╛рддрд╛ рд╣реИред
рдПрдХ рд╡рд░реНрдЧ рдХреЗ рд╕рджрд╕реНрдп рдлрд╝рдВрдХреНрд╢рди рдкрд░ рдПрдХ рдЪреЗрдХ рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреА рдЬрд╛рдВрдЪ рдЗрд╕ рдкрд░ рд▓рд┐рдЦреА рдЬрд╛рддреА рд╣реИ рдХрд┐ рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдкреНрд░рдХрд╛рд░ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИ рдпрд╛ рдирд╣реАрдВред рд╣рдо рдЬрд╛рдВрдЪрддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рдкреНрд░рдХрд╛рд░ рд╕рдВрджрд░реНрдн рд╣реИ, рдпрджрд┐ рдирд╣реАрдВ, рддреЛ рд╣рдо рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рдПрдХ рдкреЙрдЗрдВрдЯрд░ рдХреЗ рд▓рд┐рдП рдЯреЗрдореНрдкрд▓реЗрдЯ рдЬрд╛рдВрдЪ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЗ рдПрдХ рдЙрдкрдпреБрдХреНрдд рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдХреА рддрд▓рд╛рд╢ рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рдХрд┐ 24 рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рд╛рде рдХрд┐рд╕реА рднреА рдлрд╝рдВрдХреНрд╢рди рдкреЙрдЗрдВрдЯрд░реНрд╕ рдХреЗ рд▓рд┐рдП
true_type рд╣реЛрдЧрд╛ред
рдФрд░ рдЕрдм рд╣рдо рдкрд░рд┐рдгрд╛рдо рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП
is_function рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдпрд╣рд╛рдБ,
рдкрд┐рдЫрд▓реЗ рднрд╛рдЧ рдХреЗ рд╕рдорд╛рди рдХрд╛рд░рдг рдХреЗ рд▓рд┐рдП, рдореИрдВ
рдЗрдВрдЯреАрдЧреНрд░рд▓_рдХреЙрдиреНрд╕реНрдЯреИрдВрдЯ рд╕реЗ рдЗрд╕ рд╕рдВрд░рдЪрдирд╛ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдирд╣реАрдВ рдХрд░ рд╕рдХрд╛, рдЗрд╕рд▓рд┐рдП
рдЗрдВрдЯреАрдЧреНрд░рд▓_рдХреЙрдиреНрд╕реНрдЯреЗрдВрдЯ рдХрд╛ рд╡реНрдпрд╡рд╣рд╛рд░ "рд╕рд┐рдореНрдпреБрд▓реЗрдЯреЗрдб" рд╣реИред
рдФрд░ рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП
is_member_function_pointer рдпрд╣ рдЕрднреА рднреА рд╕рд░рд▓ рд╣реИ:
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЗрди рдкреИрдЯрд░реНрдиреЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рд╣рдо рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рд╕рд┐рджреНрдзрд╛рдВрдд рдореЗрдВ рд╡рд░реНрдЧ рдХрд╛ рд╕рджрд╕реНрдп рд╣реИ:
namespace detail { template<class _Tp> struct _is_member_object_pointer_impl1 : public _not_< _or_<_is_function_ptr_helper<_Tp>, _is_mem_function_ptr_helper<_Tp> > >::type { }; template<class _Tp> struct _is_member_object_pointer_impl2 : public false_type { }; template<class _Tp, class _Cp> struct _is_member_object_pointer_impl2<_Tp _Cp::*> : public true_type { }; template<class _Tp> struct _is_member_object_pointer_helper: public _and_<_is_member_object_pointer_impl1<_Tp>, _is_member_object_pointer_impl2<_Tp> >::type {}; }
рдкрд╣рд▓реЗ рднрд╛рдЧ рдХреЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдкрд░ '' рдФрд░ ',' рдпрд╛ ',' рдирд╣реАрдВ 'рддрд╛рд░реНрдХрд┐рдХ рд╕рдВрдЪрд╛рд▓рди namespace detail { struct void_type {};
рдпрд╣рд╛рдВ рд╣рдо рдЙрди рдкреНрд░рдХрд╛рд░реЛрдВ рдкрд░ рддрд╛рд░реНрдХрд┐рдХ рд╕рдВрдЪрд╛рд▓рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ
рд╕рд╢рд░реНрдд рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреА рд╕рд╣рд╛рдпрддрд╛ рд╕реЗ, рдЕрдВрддрддрдГ рдЙрдкрдпреБрдХреНрдд рдЯреЗрдореНрдкрд▓реЗрдЯ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЪрдпрди рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рд╕рднреА рдорд╣рд┐рдорд╛ рдореЗрдВ рдЯреЗрдореНрдкрд▓реЗрдЯ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ, рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рд╕рдВрдХрд▓рди рдЪрд░рдг рдореЗрдВ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдкреНрд░рдХрд╛рд░ рд╡рд░реНрдЧ рдХрд╛ рд╕рджрд╕реНрдп рд╣реИред рдХрд╛рдлреА "рдЙрдЧреНрд░", рд▓реЗрдХрд┐рди рдХрд┐рддрдирд╛ рд╢рд╛рдирджрд╛рд░ рдФрд░ рдкреНрд░рднрд╛рд╡реА!
рд╕рдорд╛рди рддрд░реНрдХ рддрддреНрд╡реЛрдВ рдкрд░ рдереЛрдбрд╝реА рдЕрдзрд┐рдХ рд╢реБрджреНрдз рдЯреЗрдореНрдкрд▓реЗрдЯ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдФрд░ рд╣рдорд╛рд░реЗ рдкрд╛рд╕
is_fundamental ,
is_compound , рдЖрджрд┐ рд╣реИрдВред рд╕рдВрдХреЗрдд (рдпрд╣ рдореБрдЭреЗ рдкреНрд░рд╕рдиреНрди рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдк?):
рдПрдХ рдЪреМрдХрд╕ рдкрд╛рдардХ рдзреНрдпрд╛рди рджреЗрдЧрд╛ рдХрд┐ is_enum рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдкрд░ рдЯрд┐рдкреНрдкрдгреА рдХреА рдЧрдИ рд╣реИред рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдореБрдЭреЗ рдПрдирдо рдХреЛ рдЕрдиреНрдп рдкреНрд░рдХрд╛рд░реЛрдВ рд╕реЗ рдЕрд▓рдЧ рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдирд╣реАрдВ рдорд┐рд▓реЗ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕рдВрдХрд▓рдХ-рдирд┐рд░реНрднрд░ рдореИрдХреНрд░реЛрдЬрд╝ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдмрд┐рдирд╛ рд╕рдВрднрд╡ рд╣реИред рд╢рд╛рдпрдж рдПрдХ рдЪреМрдХрд╕ рдФрд░ рдЬрд╛рдирдХрд╛рд░ рдкрд╛рдардХ рдЖрдкрдХреЛ рдЗрд╕ рд╕рдВрдмрдВрдз рдореЗрдВ рдЕрдкрдиреЗ рддрд░реАрдХреЗ рдпрд╛ рд╡рд┐рдЪрд╛рд░ рдХрд╛ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдмрддрд╛рдПрдЧрд╛ред
рдЗрд╕ рддрдереНрдп рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдПрдХ рдкреНрд░рдХрд╛рд░ рдПрдХ рд╡рд░реНрдЧ рд╣реИ, рдЕрдм рдФрд░ рдХреБрдЫ рдирд╣реАрдВ рдЪрд╛рд╣рд┐рдП:
namespace detail { template <class _Tp, bool _IsReference> struct _is_class_helper { typedef integral_constant<bool, false> type; }; template <class _Tp> struct _is_class_helper<_Tp, false> { typedef integral_constant<bool, (is_scalar<_Tp>::value == bool(false))
рдФрд░ рд╕рдм рдХреБрдЫ рдареАрдХ рд╣реЛ рдЬрд╛рдПрдЧрд╛, рд▓реЗрдХрд┐рди C ++ рдореЗрдВ
рдпреВрдирд┐рдпрди рдХреЛ рд╕рд╛рдорд╛рдиреНрдп рдорд╛рдорд▓реЗ рдореЗрдВ рдПрдХ рд╡рд░реНрдЧ рд╕реЗ рдЕрд▓рдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рдЕрдкрдиреЗ "рдмрд╛рд╣рд░реА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ" рдореЗрдВ рдмрд╣реБрдд рд╕рдорд╛рди рд╣реИрдВ, рдФрд░ рдореИрдВ рд╕рдВрдХрд▓рди рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рдмрд┐рдирд╛ рдЕрдВрддрд░ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП,
рдпреВрдирд┐рдпрди рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓реА рдЕрдХреНрд╖рдорддрд╛) рдХреЛ рд╕рддреНрдпрд╛рдкрд┐рдд рдирд╣реАрдВ рдХрд░ рд╕рдХрд╛ред рд╢рд╛рдпрдж рдХреЛрдИ рдЖрдкрдХреЛ рд╕рдВрдХрд▓рди рдореЗрдВ
рд╕рдВрдШ рдХрд╛ рдирд┐рд░реНрдзрд╛рд░рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреЗрдЪреАрджрд╛ рдкреИрдВрддрд░реЗрдмрд╛рдЬрд╝реА рдмрддрд╛рдПрдЧрд╛, рддреЛ
is_class рдмрд┐рд▓реНрдХреБрд▓ рдорд╛рдирдХ рдХреЗ рдЕрдиреБрд░реВрдк рд╣реЛрдЧрд╛ред
рдЗрд╕ рдЕрдзреНрдпрд╛рдп рдХреЗ
рдЕрдВрддрд┐рдо рднрд╛рдЧ рдореЗрдВ , рдореИрдВ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реВрдБрдЧрд╛ рдХрд┐ рдХреИрд╕реЗ
std :: рдХреНрд╖рдп рдФрд░
std :: common_type рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ , рд╕рд╛рде рд╣реА
рдЯрд╛рдЗрдк_рдЯреНрд░рд┐рдЯреНрд╕ рдореЗрдВ рдЬреЛ рдЬреЛрдбрд╝рд╛ рдЬрд╛рдирд╛
рдмрд╛рдХреА рд╣реИ ред
рдЖрдкрдХрд╛ рдзреНрдпрд╛рди рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред