TLDR : рдпрд╣
рдХреИрд╕реЗ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдП рдХрд┐ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреЗ рдкрд╛рд╕ рдХрд┐рд╕реА рджрд┐рдП рдЧрдП рдирд╛рдо рдФрд░ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХреЗ рд╕рд╛рде рдХреЛрдИ рд╡рд┐рдзрд┐ рд╣реИ, рдФрд░ рдЗрд╕рдХреЗ рджрд┐рдорд╛рдЧ рдХреЛ рдЦреЛрдП рдмрд┐рдирд╛ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЕрдиреНрдп рдЧреБрдгреЛрдВ рдХреЛ рднреА рдкрд╣рдЪрд╛рдиреЗрдВредрдирдорд╕реНрдХрд╛рд░ рд╕рд╛рдерд┐рдпреЛрдВ!
рдореИрдВ SFINAE рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рдФрд░ рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА (рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ *) рд╕реА ++ рднрд╛рд╖рд╛ рддрдВрддреНрд░, рдЬреЛ рдХрд┐, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдПрдХ рдЕрдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд рд╡реНрдпрдХреНрддрд┐ рдХреЛ рдмрд╣реБрдд рджрд┐рдорд╛рдЧ рддреЛрдбрд╝рдиреЗ рд╡рд╛рд▓рд╛ рд▓рдЧ рд╕рдХрддрд╛ рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЗрд╕рдХреЗ рдЙрдкрдпреЛрдЧ рдХрд╛ рд╕рд┐рджреНрдзрд╛рдВрдд рдХрд╛рдлреА рд╕рд░рд▓ рдФрд░ рд╕реНрдкрд╖реНрдЯ рд╣реИ, рдХрдИ рд╕реНрдкрд╖реНрдЯ-рдХрдЯ рдкреНрд░рд╛рд╡рдзрд╛рдиреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рддреИрдпрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИред рдпрд╣ рд▓реЗрдЦ рдЙрди рдкрд╛рдардХреЛрдВ рдХреЗ рд▓рд┐рдП рд╣реИ, рдЬрд┐рдиреНрд╣реЗрдВ C ++ рдореЗрдВ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХрд╛ рдмреБрдирд┐рдпрд╛рджреА рдЬреНрдЮрд╛рди рд╣реИ рдФрд░ рдЬреЛ рдкрд░рд┐рдЪрд┐рдд рд╣реИрдВ, рдХрдо рд╕реЗ рдХрдо рдЯреЛрдкреА рдореЗрдВ, C ++ 11 рдХреЗ рд╕рд╛рдеред
* рджреБрд░реНрднрд╛рдЧреНрдп рдХреНрдпреЛрдВ? рд╣рд╛рд▓рд╛рдВрдХрд┐ SFINAE рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рдФрд░ рд╕реБрдВрджрд░ рддрдХрдиреАрдХ рд╣реИ рдЬреЛ рдПрдХ рд╡реНрдпрд╛рдкрдХ рд░реВрдк рд╕реЗ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рднрд╛рд╖рд╛ рдХреЗ рдореБрд╣рд╛рд╡рд░реЗ рдореЗрдВ рд╡рд┐рдХрд╕рд┐рдд рд╣реБрдИ рд╣реИ, рдпрд╣ рдмреЗрд╣рддрд░ рд╣реЛрдЧрд╛ рдХрд┐ рдРрд╕реЗ рдЙрдкрдХрд░рдг рд╣реЛрдВ рдЬреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреЗ рд╣реЛрдВред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдХреЗрд╡рд▓ рдорд╛рдорд▓реЗ рдореЗрдВ, рдореИрдВ C ++ рдореЗрдВ рдореЗрдЯрд╛рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╣реБрдд рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рдХрд╣реВрдВрдЧрд╛ред рдореЗрдЯрд╛рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдПрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЗ рд╕рдВрдХрд▓рди рдХреЗ рджреМрд░рд╛рди рдХрд┐рдпрд╛ рдЬрд╛рдиреЗ рд╡рд╛рд▓рд╛ рдСрдкрд░реЗрд╢рди рд╣реИред рдЬреИрд╕реЗ рд╣реА рдирд┐рдпрдорд┐рдд рдХрд╛рд░реНрдп рдЖрдкрдХреЛ рдорд╛рди рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВ, рдЖрдк рдореЗрдЯрд╛рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рдВрдХрд▓рди-рд╕рдордп рдкреНрд░рдХрд╛рд░ рдФрд░ рд╕реНрдерд┐рд░рд╛рдВрдХ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВред рдореЗрдЯрд╛рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреЗ рд╕рдмрд╕реЗ рд▓реЛрдХрдкреНрд░рд┐рдп рдЙрдкрдпреЛрдЧреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдХреЗрд╡рд▓ рдПрдХ рд╕реЗ рджреВрд░, рдкреНрд░рдХрд╛рд░ рдХреЗ рдЧреБрдгреЛрдВ рдХреЛ рдкрд╣рдЪрд╛рдирдирд╛ рд╣реИред рдпрд╣ рд╕рдм, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдХреЗ рд╡рд┐рдХрд╛рд╕ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ: рдХрд╣реАрдВ рди рдХрд╣реАрдВ рдпрд╣ рдЬрд╛рдирдирд╛ рдЙрдкрдпреЛрдЧреА рд╣реИ рдХрд┐ рдХреНрдпрд╛ рд╣рдо рдПрдХ рдЧреИрд░-рддреБрдЪреНрдЫ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЗ рд╕рд╛рде рдПрдХ рдЬрдЯрд┐рд▓ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╡рд░реНрдЧ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдпрд╛ рдПрдХ рдирд┐рдпрдорд┐рдд рд░реВрдк рд╕реЗ
int
, рдХрд╣реАрдВ рди рдХрд╣реАрдВ рдпрд╣ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдПрдХ рдкреНрд░рдХрд╛рд░ рджреВрд╕рд░реЗ рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛ рд╣реИ, рдпрд╛ рдХреНрдпрд╛ рдпрд╣ рдПрдХ рдХреЛ рдмрджрд▓рдирд╛ рд╕рдВрднрд╡ рд╣реИред рджреВрд╕рд░реЗ рдореЗрдВ рдЯрд╛рдЗрдк рдХрд░реЗрдВред рд╣рдо рдПрдХ рдХреНрд▓рд╛рд╕рд┐рдХ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ SFINAE рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддрдВрддреНрд░ рдХреЛ рджреЗрдЦреЗрдВрдЧреЗ: рдпрд╣ рдЬрд╛рдБрдЪрдирд╛ рдХрд┐ рдХреНрдпрд╛ рдПрдХ рд╕рджрд╕реНрдп рдлрд╝рдВрдХреНрд╢рди рдХрд┐рд╕реА рд╡рд░реНрдЧ рдореЗрдВ рджрд┐рдП рдЧрдП рдкреНрд░рдХрд╛рд░ рдХреЗ рддрд░реНрдХреЛрдВ рдФрд░ рд╡рд╛рдкрд╕реА рдореВрд▓реНрдп рдХреЗ рд╕рд╛рде рдореМрдЬреВрдж рд╣реИред рдореИрдВ рдкрд░реАрдХреНрд╖рдг рдореЗрдЯрд╛рдлрдВрдХреНрд╢рди рдмрдирд╛рдиреЗ рдХреЗ рд╕рднреА рдЪрд░рдгреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдФрд░ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдЬрд╛рдиреЗ рдФрд░ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдВрдЧрд╛ рдХрд┐ рдпрд╣ рдХрд╣рд╛рдВ рд╕реЗ рдЖрддрд╛ рд╣реИред
рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдирд╛рдо SFINAE
рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рд╡рд┐рдлрд▓рддрд╛ рдХреЗ рд▓рд┐рдП рдЦрдбрд╝рд╛
рд╣реИ рдПрдХ рддреНрд░реБрдЯрд┐ рдирд╣реАрдВ рд╣реИ рдФрд░ рдЗрд╕рдХрд╛ рдорддрд▓рдм рдирд┐рдореНрди рд╣реИ: рдЬрдм рдлрд╝рдВрдХреНрд╢рди рдЕрдзрд┐рднрд╛рд░ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЧрд▓рдд рдЯреЗрдореНрдкрд▓реЗрдЯ рдЭрдЯрдкрдЯ рдПрдХ рд╕рдВрдХрд▓рди рддреНрд░реБрдЯрд┐ рдХрд╛ рдХрд╛рд░рдг рдирд╣реАрдВ рдмрдирддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╕рдмрд╕реЗ рдЙрдкрдпреБрдХреНрдд рдЕрдзрд┐рднрд╛рд░ рдХреЗ рд▓рд┐рдП рдЙрдореНрдореАрджрд╡рд╛рд░реЛрдВ рдХреА рд╕реВрдЪреА рд╕реЗ рдЦрд╛рд░рд┐рдЬ рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдорд╛рдирд╡реАрдп рд░реВрдк рд╕реЗ, рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ:
- рдЬрдм рдпрд╣ SFINAE рдХреА рдмрд╛рдд рдЖрддреА рд╣реИ, рддреЛ рдпрд╣ рдЬрд░реВрд░реА рд╣реИ рдХрд┐ рдлрд╝рдВрдХреНрд╢рди рдУрд╡рд░рд▓реЛрдбрд┐рдВрдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реЛред
- рдпрд╣ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИ рдЬрдм рдлрд╝рдВрдХреНрд╢рди рддрд░реНрдХреЛрдВ рджреНрд╡рд╛рд░рд╛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдХрдЯреМрддреА рдХреА рдЬрд╛рддреА рд╣реИред
- рдЬрдм рдХреБрдЫ рд╕рд┐рдВрдЯреИрдХреНрд╕ рддреНрд░реБрдЯрд┐ рдХреЗ рдХрд╛рд░рдг рдЙрдиреНрд╣реЗрдВ рддрддреНрдХрд╛рд▓ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рддреЛ рдХреБрдЫ рдУрд╡рд░рд▓реЛрдб рдХреЛ рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ; рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рд╕рдВрдХрд▓рди рдЬрд╛рд░реА рд░рд╣рддрд╛ рд╣реИ рдЬреИрд╕реЗ рдХрд┐ рдХреБрдЫ рднреА рдирд╣реАрдВ рд╣реБрдЖ, рдмрд┐рдирд╛ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗред
- рдХреЗрд╡рд▓ рдПрдХ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЛ рдЦрд╛рд░рд┐рдЬ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
- SFINAE рдХреЗрд╡рд▓ рдлрд╝рдВрдХреНрд╢рди рд╣реЗрдбрд░ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рддрд╛ рд╣реИ, рдлрд╝рдВрдХреНрд╢рди рдмреЙрдбреА рдореЗрдВ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдЫреЛрдбрд╝ рдирд╣реАрдВ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреБрдЫ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЕрдзрд┐рднрд╛рд░ рдореЗрдВ рд╣реЗрд░рдлреЗрд░ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рд╣реИ, рдЙрдирдореЗрдВ рд╕реЗ рдХреБрдЫ рдХреЛ рдЫрд┐рдкрд╛рдирд╛ рдЕрдЧрд░ рдХреГрддреНрд░рд┐рдо рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдмрдирд╛рдХрд░ рдЖрд╡рд╢реНрдпрдХ рд╣реЛред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЫрд┐рдкреЗ рд╣реБрдП рдЙрдореНрдореАрджрд╡рд╛рд░ рдХреЛ рдПрдХ рдЯреЗрдореНрдкрд▓реЗрдЯ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рдПрдХ рддреНрд░реБрдЯрд┐ рдХрд╛ рддрдереНрдп рдЗрд╕ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЗ рдкреИрд░рд╛рдореАрдЯрд░ рдкрд░ рдирд┐рд░реНрднрд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдХрдВрдкрд╛рдЗрд▓рд░ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рдХреЗ рдмрд┐рдирд╛ рдЕрдиреНрдп рдкреНрд░рдХрд╛рд░ рдХреА рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдкрд╣рдЪрд╛рдирдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдЧрд╛, рдЦрд╛рдХрд╛ рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЛ рдмрдореБрд╢реНрдХрд┐рд▓ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдХреЛрдИ SFINAE рд╕рдлрд▓ рдирд╣реАрдВ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рд╣рдореЗрдВ рджрд░реНрдж рд╕реЗ рдбрд╛рдВрдЯрд╛ рдЬрд╛рдПрдЧрд╛ред
рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдЙрджрд╛рд╣рд░рдг рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:
int difference(int val1, int val2) { return val1 - val2; } template<typename T> typename T::difference_type difference(const T& val1, const T& val2) { return val1 - val2; }
difference
рдлрд╝рдВрдХреНрд╢рди рдкреВрд░реНрдгрд╛рдВрдХ рддрд░реНрдХреЛрдВ рдХреЗ рд▓рд┐рдП рдареАрдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдХрд╕реНрдЯрдо рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде, рд╕реВрдХреНрд╖реНрдорддрд╛рдПрдВ рд╢реБрд░реВ рд╣реЛрддреА рд╣реИрдВред рдШрдЯрд╛рд╡ рдХрд╛ рдкрд░рд┐рдгрд╛рдо рд╣рдореЗрд╢рд╛ рдСрдкрд░реЗрдВрдб рдХреЗ рд╕рдорд╛рди рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред рддреЛ, рджреЛ рддрд┐рдерд┐рдпреЛрдВ рдХрд╛ рдЕрдВрддрд░ рдПрдХ рд╕рдордп рдЕрдВрддрд░рд╛рд▓ рд╣реИ, рдЬреЛ рдЕрдкрдиреЗ рдЖрдк рдореЗрдВ рдПрдХ рддрд┐рдерд┐ рдирд╣реАрдВ рд╣реИред рдпрджрд┐ рдХрд╕реНрдЯрдо рдкреНрд░рдХрд╛рд░
MyDate
рдЗрд╕рдХреЗ рднреАрддрд░ рдПрдХ
MyDate
рдкрд░рд┐рднрд╛рд╖рд╛ рд╣реИ, рддреЛ
typedef MyInterval difference_type;
рдФрд░ рдШрдЯрд╛рд╡
MyInterval operator - (const MyDate& rhs) const;
, рдЯреЗрдореНрдкрд▓реЗрдЯ рдЕрдзрд┐рднрд╛рд░ рдЙрд╕ рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИред рдХреЙрд▓рд┐рдВрдЧ
difference(date1, date2)
рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдЕрдзрд┐рднрд╛рд░ рдФрд░ рд╕рдВрд╕реНрдХрд░рдг рджреЛрдиреЛрдВ рдХреЛ "рджреЗрдЦрдиреЗ" рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдЧрд╛
difference(date1, date2)
рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ, рдЬрдмрдХрд┐ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдЕрдзрд┐рднрд╛рд░ рдХреЛ рдЕрдзрд┐рдХ рдЙрдкрдпреБрдХреНрдд рдорд╛рдирд╛ рдЬрд╛рдПрдЧрд╛ред
MyString
рдкреНрд░рдХрд╛рд░, рдЬрд┐рд╕рдореЗрдВ рдХреЛрдИ
MyString
рдЯрд╛рдЗрдк рдирд╣реАрдВ рд╣реИ, рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдП рдЬрд╛рдиреЗ рдкрд░ рдПрдХ рддреНрд░реБрдЯрд┐ рдХрд╛ рдХрд╛рд░рдг рдмрдиреЗрдЧрд╛: рдлрд╝рдВрдХреНрд╢рди рдПрдХ рдиреЙрди-рдЯрд╛рдЗрдк рдкреНрд░рдХрд╛рд░ рд▓реМрдЯрд╛рдПрдЧрд╛ред
MyString
рдкреНрд░рдХрд╛рд░ рдХреЗ рддрд░реНрдХреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ
difference
рдХреЙрд▓ рдХреЗрд╡рд▓ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдПрдХ
difference
рд╕рдВрд╕реНрдХрд░рдг "рджреЗрдЦ" рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рдПрдХрд▓ рд╕рдВрд╕реНрдХрд░рдг рдХреЗрд╡рд▓ рддрднреА рдЙрдкрдпреБрдХреНрдд рд╣реЛрдЧрд╛ рдЬрдм рдирдВрдмрд░ рдСрдкрд░реЗрдЯрд░ рдореЗрдВ рд░реВрдкрд╛рдВрддрд░рдг
MyString
рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реЛред рдирд┐рд░реНрдорд╛рдг
val1 - val2
рдореЗрдВ рдПрдХ рдмрд╛рдЗрдирд░реА рдорд╛рдЗрдирд╕ рдСрдкрд░реЗрдЯрд░ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдФрд░ рдпрд╣ рд╕рд┐рдВрдЯреИрдХреНрд╕ рддреНрд░реБрдЯрд┐ рднреА рдЙрддреНрдкрдиреНрди рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдлрд╝рдВрдХреНрд╢рди
difference
рдПрдХ рд╕рд╛рде рддреАрди рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд╛рде рддрд░реНрдХ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреА рдЬрд╛рдВрдЪ рдХрд░рддрд╛ рд╣реИ: рдЕрдВрддрд░_рдЯрд╛рдЗрдк рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐, рдШрдЯрд╛рд╡ рдСрдкрд░реЗрдЯрд░ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдФрд░ рдкреНрд░рдХрд╛рд░ рдХреЗ
difference_type
рд╕реЗ рдШрдЯрд╛рд╡ рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдЕрдВрддрд░_рдЯрд╛рдЗрдк (рд░реВрдкрд╛рдВрддрд░рдг
return
рджреНрд╡рд╛рд░рд╛ рдирд┐рд╣рд┐рдд рд╣реИ)ред рд▓реЗрдХрд┐рди рдкрд╣рд▓реА рд╕реНрдерд┐рддрд┐ рдХрд╛ рдЙрд▓реНрд▓рдВрдШрди рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП, рдпрд╣ рдЕрдзрд┐рднрд╛рд░ рджрд┐рдЦрд╛рдИ рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИ, рджреВрд╕рд░реА рдпрд╛ рддреАрд╕рд░реА рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдХрд╛ рдЙрд▓реНрд▓рдВрдШрди рд╕рдВрдХрд▓рди рддреНрд░реБрдЯрд┐ рдХрд╛ рдХрд╛рд░рдг рд╣реЛрдЧрд╛ред
рдЖрдЗрдП рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ рдХрд┐ рдПрдХ рдореЗрдЯрд╛рдлрд╝рдВрдХреНрд╢рди рдХреИрд╕реЗ рдмрдирд╛рдпрд╛ рдЬрд╛рдП рдЬреЛ рд╣рдореЗрдВ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐
void foo(int)
рд╡рд┐рдзрд┐ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдореЗрдВ рд╣реИред рдПрд╕рдЯреАрдПрд▓ рдХреА рджреЗрдЦрднрд╛рд▓, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд╕рдВрд╕реНрдХрд░рдг рд╕реА ++ 11 рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░рдирд╛, рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдХрдИ рдЙрдкрдпреЛрдЧреА рдореЗрдЯрд╛рдлрдВрдХреНрд╢рдВрд╕ рдХреА рдкрд╣рдЪрд╛рди рдХрд░ рдЪреБрдХрд╛ рд╣реИ рдЬреЛ рдореБрдЦреНрдп рд░реВрдк рд╕реЗ
type_traits
рдФрд░
limits
рд╣реЗрдбрд░ рдореЗрдВ рд╕реНрдерд┐рдд рд╣реИрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдХрд┐рд╕реА рдХрд╛рд░рдг рд╕реЗ рд╣рдо рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреНрдпрд╛ рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд░рддреЗ рд╣реИрдВ, рдпрд╣ рдмрд┐рд▓реНрдХреБрд▓ рдирд╣реАрдВ рд╣реИред рдПрдХ рдореЗрдЯрд╛рдлрд╝рдВрдХреНрд╢рди рдЖрдорддреМрд░ рдкрд░ рдбреЗрдЯрд╛ рдХреЗ рдмрд┐рдирд╛ рдПрдХ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рд╕рдВрд░рдЪрдирд╛ рдХреА рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдЕрдВрджрд░ рдСрдкрд░реЗрд╢рди рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдкрд░рд┐рднрд╛рд╖рд┐рдд рд╣реЛрддрд╛ рд╣реИ: рдЯрд╛рдЗрдкрдбрд┐рдл рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ
type
рдпрд╛ рд╕реНрдерд┐рд░ рд╕реНрдерд┐рд░
value
ред рдПрд╕рдЯреАрдПрд▓ рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рд╕рдордЭреМрддреЗ рдХрд╛ рдкрд╛рд▓рди рдХрд░рддрд╛ рд╣реИ, рдФрд░ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдореВрд▓ рд╣реЛрдиреЗ рдХрд╛ рдХреЛрдИ рдХрд╛рд░рдг рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рд╕реНрдерд╛рдкрд┐рдд рдореЙрдбрд▓ рдХрд╛ рдкрд╛рд▓рди рдХрд░реЗрдВрдЧреЗред
рдЖрдк рддреБрд░рдВрдд рд╣рдорд╛рд░реЗ рднрд╡рд┐рд╖реНрдп рдХреЗ рдореЗрдЯрд╛рдлрд╝рдВрдХреНрд╢рди рдХрд╛ "рдХрдВрдХрд╛рд▓" рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ:
template<typename T> struct has_foo{};
рдпрд╣
рдПрдХ рд╡рд┐рдзрд┐ рдХреА
рдЙрдкрд▓рдмреНрдзрддрд╛ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдпрд╣ рддреБрд░рдВрдд рд╕реНрдкрд╖реНрдЯ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдкрд░рд┐рдгрд╛рдо рдмреВрд▓рд┐рдпрди рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП:
template<typename T> struct has_foo{ static constexpr bool value = true;
рдФрд░ рдЕрдм рд╣рдореЗрдВ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдПрдХ рдУрд╡рд░рд▓реЛрдб рдХреИрд╕реЗ рдХрд░рдирд╛ рд╣реИ рдЬреЛ рд╣рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЧреБрдгреЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдЗрд╕рдХреЗ рд╕рд╛рде рдПрдХ рдмреВрд▓рд┐рдпрди рдХреИрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВред рд╕реБрдВрджрд░рддрд╛ рдпрд╣ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рд╢рд░реАрд░ рдХреЛ рдЕрдзрд┐рдХ рднрд╛рд░ рджреЗрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ: рдЪреВрдВрдХрд┐ рд╕рднреА рдХрд╛рд░реНрдп рд╕рдВрдХрд▓рди рдореЛрдб рдореЗрдВ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╣реЗрд░рдлреЗрд░ рдХреЗ рдХрд╛рд░рдг, рдмрд╕ рдШреЛрд╖рдгрд╛рдПрдВ рдкрд░реНрдпрд╛рдкреНрдд рд╣реИрдВред
рдЬрд╛рд╣рд┐рд░ рд╣реИ, рд╣рдо рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рд╣рдорд╛рд░реА рдЙрдкрдорд╛ рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рд╕реЗ рд▓рд╛рдЧреВ рд╣реЛред рдЖрдЦрд┐рд░рдХрд╛рд░, рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ, рдХреЛрдИ рдХрд╣ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдЗрд╕рдореЗрдВ рдХреЛрдИ рдЖрд╡рд╢реНрдпрдХ рд╡рд┐рдзрд┐ рд╣реИред рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐
has_foo
рдХреЛ рд╕рдВрдХрд▓рди рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХрд╛ рдХрд╛рд░рдг рдирд╣реАрдВ
has_foo
рдЪрд╛рд╣рд┐рдП, рдЪрд╛рд╣реЗ рд╣рдо рдХрд┐рд╕реА рднреА рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддреЗ рд╣реЛрдВред рд▓реЗрдХрд┐рди рдПрдХ рддреНрд░реБрдЯрд┐ рддрдм рд╣реЛрдЧреА рдЬрдм рдпрд╣ рдЕрдЪрд╛рдирдХ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ рдЯрд╛рдЗрдк рдЯреА рдореЗрдВ рдХреЛрдИ рдЖрд╡рд╢реНрдпрдХ рд╡рд┐рдзрд┐ рдирд╣реАрдВ рд╣реИред рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдПрдХ рдкрд░реАрдХреНрд╖рдг рдлрд╝рдВрдХреНрд╢рди рдХреЗ рджреЛ рдЕрдзрд┐рднрд╛рд░ рдЪрд╛рд╣рд┐рдПред рдЙрдирдореЗрдВ рд╕реЗ рдПрдХ, "рдбрд┐рдЯреЗрдХреНрдЯрд░", рд╡рд╛рдВрдЫрд┐рдд рд╡рд┐рдзрд┐ рд╡рд╛рд▓реЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рд╕рд╣реА рд░реВрдк рд╕реЗ рд╕рд╣реА рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЕрдиреНрдп, "рд╕рдорд░реНрдерди", рд╕рд░реНрд╡рд╡реНрдпрд╛рдкреА рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЕрд░реНрдерд╛рддреН, рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдЙрдкрдпреБрдХреНрдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ, "рд╕рдмреНрд╕рдЯреНрд░реЗрдЯ" рдкрд░ рдПрдХ "рдбрд┐рдЯреЗрдХреНрдЯрд░" рдХреЛ "рдЙрдкрдпреБрдХреНрддрддрд╛" рдореЗрдВ рдПрдХ рдирд┐рд░реНрд╡рд┐рд╡рд╛рдж рд▓рд╛рдн рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдХрдо рд╕реЗ рдХрдо рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рдФрд░ рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рдЕрдзрд┐рднрд╛рд░ рдХрд╛ рдирд┐рд░реНрдзрд╛рд░рдг рдХрд░рдиреЗ рдореЗрдВ рд╕рдмрд╕реЗ рд╕рд░реНрд╡рд╛рд╣рд╛рд░реА рдЗрд▓рд┐рдкреНрд╕рд┐рд╕ (рджреАрд░реНрдШрд╡реГрддреНрдд, рдПрдХ рдЪрд░ рд╕рдВрдЦреНрдпрд╛ рдХреЗ рддрд░реНрдХ рдХреЛ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ):
template<typename T> struct has_foo{ void detect(...);
рдЕрдм рдЖрдкрдХреЛ "рдбрд┐рдЯреЗрдХреНрдЯрд░" рдШреЛрд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрд╣ рдПрдХ рдЯреЗрдореНрдкрд▓реЗрдЯ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП: рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЯреЗрдореНрдкрд▓реЗрдЯ рд╕рдВрд░рдЪрдирд╛ рдХреЗ рдЕрдВрджрд░ рд╣реИ рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реИ! рд╣рдореЗрдВ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдХреЗ рдЕрдВрджрд░ рдПрдХ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ [рд╣рдо рдХреБрдЫ рд╣реА рд╕реЗрдХрдВрдбреНрд╕ рдХреЗ
рд▓рд┐рдП рдлрд┐рд▓реНрдо
рдЗрдВрд╕реЗрдкреНрд╢рди рдХреЗ рдирд╛рдпрдХреЛрдВ рд╕реЗ рдЭрд▓рдХ рдкрд╛рдиреЗ рдХрд╛ рдЖрдирдВрдж рд▓реЗрддреЗ рд╣реИрдВ] рдпрд╣ "рдмреИрдХрд┐рдВрдЧ" рдкрд░ рд▓рд╛рдЧреВ рдирд╣реАрдВ рд╣реЛрддрд╛, рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдЗрд╕реЗ рдХрднреА рдирд╣реАрдВ рдлреЗрдВрдХреЗрдВрдЧреЗред рд▓реЗрдХрд┐рди "рдбрд┐рдЯреЗрдХреНрдЯрд░" рдХреЗ рд▓рд┐рдП рд╣рдо рдЬрд╛рджреВ рд╢рдмреНрдж
decltype
рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдФрд░ рд╕реНрд╡рдпрдВ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреА рдЧрдгрдирд╛ рдирд╣реАрдВ рдХреА рдЬрд╛рддреА рд╣реИ рдФрд░ рдХреЛрдб рдореЗрдВ рдЕрдиреБрд╡рд╛рдж рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╣рдо рд╡рд╛рдВрдЫрд┐рдд рдкреНрд░рдХрд╛рд░ рдХреЗ рддрд░реНрдХреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рд╣реА рд╡рд┐рдзрд┐ рдХреА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдлрд┐рд░
decltype
рдЙрддреНрддрд░ рд╡рд┐рдзрд┐ рдХрд╛ рд░рд┐рдЯрд░реНрди рдкреНрд░рдХрд╛рд░ рд╣реЛрдЧрд╛ред рдФрд░ рдЕрдЧрд░ рдЙрд╕ рдирд╛рдо рдХреЗ рд╕рд╛рде рдХреЛрдИ рд╡рд┐рдзрд┐ рдирд╣реАрдВ рд╣реИ, рдпрд╛ рдпрд╣ рдЕрдиреНрдп рдкреНрд░рдХрд╛рд░ рдХреЗ рддрд░реНрдХ рд▓реЗрддрд╛ рд╣реИ, рддреЛ рд╣рдореЗрдВ рд╡рд╣реА рдирд┐рдпрдВрддреНрд░рд┐рдд рддреНрд░реБрдЯрд┐ рдорд┐рд▓рддреА рд╣реИ рдЬреЛ рд╣рдо рдЪрд╛рд╣рддреЗ рдереЗред "рдбрд┐рдЯреЗрдХреНрдЯрд░" рдХреЛ
foo
рдХреЗ рд╕рдорд╛рди рд▓реМрдЯрд╛рдПрдВ:
template<typename T> struct has_foo{ void detect(...); template<typename U> decltype(U().foo(42)) detect(const U&); static constexpr bool value = true;
рдпрджрд┐ рд╣рдо
detect
рд▓рд┐рдП
const T&
рд╕рдВрджрд░реНрдн рджреЗрддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐
U
,
const T&
рдХреЗ рд╕рдорд╛рди рд╣реИ
T
рд▓реМрдЯрд╛рдП рдЧрдП рдореВрд▓реНрдп рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рдкрддреНрд░рд╛рдЪрд╛рд░ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдмрд╛рдж рдореЗрдВ рдбрд┐рдЯреЗрдХреНрдЯрд░ рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд░реЗрдВрдЧреЗ рдпрд╛ рд░рд╛рд╕реНрддреЗ рдореЗрдВ рдХреБрдЫ рдФрд░ рд▓реЗрдХрд░ рдЖрдПрдВрдЧреЗред
рд▓реЗрдХрд┐рди рд░реБрдХрд┐рдП! рд╣рдо рдирдП рд╕рд┐рд░реЗ рд╕реЗ рдирд┐рд░реНрдорд┐рдд рдЕрдирд╛рдо рд╡рд╕реНрддреБ рдкрд░ рд╡рд┐рдзрд┐ рдХрд╣рддреЗ рд╣реИрдВ, рдФрд░ рдпрд╣ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдирд┐рд░реНрдорд┐рдд рд╣реЛрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рд╣рдо
has_foo
рдкреНрд░рдХрд╛рд░ рдХрд╛ рдкрд╛рд╕ рдХрд░реЗрдВ
has_foo
рдХрд╛ рдХреЛрдИ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдирд┐рд░реНрдорд╛рддрд╛ рдирд╣реАрдВ рд╣реИ? рдмреЗрд╢рдХ, рдПрдХ рд╕рдВрдХрд▓рди рддреНрд░реБрдЯрд┐ред рдХреБрдЫ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдШреЛрд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рд╕рд╣реА рд╣реЛрдЧрд╛ рдЬреЛ рд╡рд╛рдВрдЫрд┐рдд рдкреНрд░рдХрд╛рд░ рдХрд╛ рдорд╛рди рд▓реМрдЯрд╛рддрд╛ рд╣реИред рдЗрд╕реЗ рд╡реИрд╕реЗ рднреА рдирд╣реАрдВ рдХрд╣рд╛ рдЬрд╛рдПрдЧрд╛, рдФрд░ рд╡рд╛рдВрдЫрд┐рдд рдкреНрд░рднрд╛рд╡ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдПрд╕рдЯреАрдПрд▓ рдиреЗ рдЗрд╕ рдмрд╛рдд рдХрд╛ рднреА рдзреНрдпрд╛рди рд░рдЦрд╛:
utility
рд╣реЗрдбрд░ рдореЗрдВ
declval
рдлрдВрдХреНрд╢рди рд╣реИ:
template<typename T> struct has_foo{ void detect(...); template<typename U> decltype(std::declval<U>().foo(42)) detect(const U&); static constexpr bool value = true;
рдпрд╣ рдХреЗрд╡рд▓ "рдбрд┐рдЯреЗрдХреНрдЯрд░" рд╕реЗ "рд╕рдмреНрд╕рдЯреНрд░реЗрдЯ" рдХреЛ рднреЗрдж рдХрд░рдирд╛ рд╕реАрдЦрдирд╛ рдмрд╛рдХреА рд╣реИред рдпрд╣рд╛рдВ рд╡рд╣реА
decltype
рд╣рдорд╛рд░реА рдорджрдж рдХрд░реЗрдЧрд╛ред "рд╕рдмреНрд╕рдЯреНрд░реЗрдЯ" рдореЗрдВ рд╡рд╛рдкрд╕реА рдкреНрд░рдХрд╛рд░ рд╣рдореЗрд╢рд╛
void
рд╣реЛрддрд╛
void
, рдФрд░ "рдбрд┐рдЯреЗрдХреНрдЯрд░" рдореЗрдВ рд╡рд┐рдзрд┐ рджреНрд╡рд╛рд░рд╛ рд▓реМрдЯрд╛рдпрд╛ рдЧрдпрд╛ рдкреНрд░рдХрд╛рд░ рд╣реЛрддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рдд, рдЬрдм рд╡рд┐рдзрд┐ рд╣рдорд╛рд░реА рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЛ рдкреВрд░рд╛ рдХрд░рддреА рд╣реИ ... рд╕рдорд╛рди
void
ред рдпрд╣ рдХрд╛рдо рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣рдо "рд╕рдмреНрд╕рдЯреНрд░реЗрдЯ" рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ
int
рдмрджрд▓ рджреЗрдВрдЧреЗред рдлрд┐рд░ рдЪреЗрдХ рд╕рд░рд▓ рд╣реИ: рдпрджрд┐ рдСрдмреНрдЬреЗрдХреНрдЯ
T
рдкрд░
detect
рдХреЙрд▓ рдЯрд╛рдЗрдк
void
, рддреЛ "рдбрд┐рдЯреЗрдХреНрдЯрд░" рдиреЗ рдХрд╛рдо рдХрд┐рдпрд╛ рд╣реИ рдФрд░ рд╡рд┐рдзрд┐ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╣рдорд╛рд░реА рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХрд╛ рдЕрдиреБрдкрд╛рд▓рди рдХрд░рддреА рд╣реИред рдпрджрд┐ рдкреНрд░рдХрд╛рд░ рдЕрд▓рдЧ рд╣реИ, рддреЛ рдпрд╛ рддреЛ "рд╕рдмреНрд╕рдЯреНрд░реЗрдЯ" рдХрд╛рдо рдХрд┐рдпрд╛, рдпрд╛ рд╡рд┐рдзрд┐ рдореМрдЬреВрдж рд╣реИ, рдЙрд╕реА рддрд░реНрдХ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХреБрдЫ рдЧрд▓рдд рджреЗрддрд╛ рд╣реИред рд╣рдо рдЬрд╛рдБрдЪрддреЗ рд╣реИрдВ рдХрд┐ рдПрд╕рдЯреАрдПрд▓ рдХрд┐рддрдирд╛ рд╕рд╛рд╡рдзрд╛рди рд╣реИ, рдФрд░ рдлрд┐рд░ рд╣рдо
is_same
рд╕рдорд╛рдирддрд╛ рдХреЗ рд▓рд┐рдП рдЬрд╛рдБрдЪ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ
is_same
:
template<typename T> struct has_foo{ private:
рд╣реБрд░реНрд░реЗ, рд╣рдордиреЗ рд╡рд╛рдВрдЫрд┐рдд рд╣рд╛рд╕рд┐рд▓ рдХрд┐рдпрд╛ рд╣реИред рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд╕рдм рдХреБрдЫ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрд╛рдлреА рд╕рд░рд▓ рд╣реИред рд╣рдо рдЙрди рдкреНрд░реЛрдЧреНрд░рд╛рдорд░реЛрдВ рдХреЛ рд╢реНрд░рджреНрдзрд╛рдВрдЬрд▓рд┐ рдЕрд░реНрдкрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рдкрд┐рдЫрд▓реЗ рдорд╛рдирдХ рдХреА рдХрдареЛрд░ рдкрд░рд┐рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ рдЗрд╕ рдЪрд╛рд▓ рдХреЛ рдХрд░рдиреЗ рдореЗрдВ рдХрд╛рдордпрд╛рдм рд░рд╣реЗ,
declval
рд░реВрдк рдореЗрдВ рдРрд╕реА рдЙрдкрдпреЛрдЧреА рдЪреАрдЬреЛрдВ рдХреА рдХрдореА рдХреЗ рдХрд╛рд░рдг рдмрд╣реБрдд рдЕрдзрд┐рдХ
declval
рдФрд░ рд╕рд░рд▓ред
SFINAE рдЗрддрдирд╛ рд╡реНрдпрд╛рдкрдХ рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рджреЗрдЦрднрд╛рд▓ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ STL рдореЗрдВ рд╡рд┐рд╢реЗрд╖
enable_if
рдореЗрдЯрд╛рдлрд╝рдВрдХреНрд╢рди рднреА рд╢рд╛рдорд┐рд▓ рд╣реИред рдЗрд╕рдХреЗ рдкреИрд░рд╛рдореАрдЯрд░ рдмреБрд▓рд┐рдпрди рд╕реНрдерд┐рд░ рдФрд░ рдкреНрд░рдХрд╛рд░ рд╣реИрдВ (рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ
void
)ред рдпрджрд┐
true
рдкрд╛рд╕ рд╣реИ, рддреЛ рдореЗрдЯрд╛рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдЯрд╛рдЗрдк
type
рдореМрдЬреВрдж рд╣реИ: рджреВрд╕рд░рд╛ рдкреИрд░рд╛рдореАрдЯрд░ рджреНрд╡рд╛рд░рд╛ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ред рдпрджрд┐
false
рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╡рд╣рд╛рдВ рдХреЛрдИ
type
рдирд╣реАрдВ рд╣реИ, рдЬреЛ рдмрд╣реБрдд рдирд┐рдпрдВрддреНрд░рд┐рдд рддреНрд░реБрдЯрд┐ рдкреИрджрд╛ рдХрд░рддрд╛ рд╣реИред рдПрдХ рд╕реНрд╡рдЪреНрдЫ рдЫреЛрдЯреА рд╕реВрдЪреА рдореЗрдВ рдКрдкрд░ рд╕реВрдЪреАрдмрджреНрдз рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреЗ рдкреНрд░рдХрд╛рд╢ рдореЗрдВ, рдХрд┐рд╕реА рдХреЛ рдпрд╣ рдпрд╛рдж рд░рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐
enable_if
рдлрд╝рдВрдХреНрд╢рди рдУрд╡рд░рд▓реЛрдб рдХреЛ рдХреЗрд╡рд▓ "рд╣рдЯрд╛рдиреЗ" рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдЧрд╛ рдпрджрд┐ рдпрд╣ рдПрдХ рдЯреЗрдореНрдкрд▓реЗрдЯ рд╣реИ, рдФрд░ рдпрд╣ рднреА рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ "рдЕрдЪрд┐рд╣реНрдирд┐рдд" рдЕрдзрд┐рднрд╛рд░ рдХреА рд╕реВрдЪреА рдХрднреА рднреА рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЦрд╛рд▓реА рдирд╣реАрдВ рд░рд╣рддреА рд╣реИред рдЖрдк рдЯреЗрдореНрдкрд▓реЗрдЯ рд╡рд░реНрдЧ рдХреА
enable_if
рдореЗрдВ
enable_if
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдпрд╣ SFINAE рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдХреБрдЫ рднреА рдЬреИрд╕реЗ
static_assert
ред
рдЕрдВрдд рдореЗрдВ, рдореИрдВ рдЗрд╕ рддрдереНрдп рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдЗрд╕ рддрдВрддреНрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдЧреБрдгреЛрдВ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдмрд╣реБрдд рд╡реНрдпрд╛рдкрдХ рд╣реИред рдЖрдк рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕реАрдзреЗ рдЕрдкрдиреЗ рдЗрдЪреНрдЫрд┐рдд рдЙрджреНрджреЗрд╢реНрдп рдХреЗ рд▓рд┐рдП рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдХрд╛рд░реНрдпреЛрдВ рдФрд░ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рдЕрдиреБрдХреВрд▓рд┐рдд рдЕрдзрд┐рднрд╛рд░ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ: рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдЕрднрд┐рдЧрдо рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдк рдЕрдиреБрдХреНрд░рдорд┐рдХ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рд╕реНрд╡рддрдВрддреНрд░рддрд╛ рдХрд╛ рдЬреЛрдЦрд┐рдо рдЙрдард╛ рд╕рдХрддреЗ рд╣реИрдВред рдФрд░ рдпрджрд┐ рдЖрдк рдЪрд╛рд╣реЗрдВ, рддреЛ рдЖрдк рдЕрдзрд┐рдХ рд╡рд┐рдЪрд┐рддреНрд░ рдбрд┐рдЬрд╛рдЗрдиреЛрдВ рдХреЗ рд╕рд╛рде рдЖ рд╕рдХрддреЗ рд╣реИрдВ,
рдЦрд╛рд╕рдХрд░ рдпрджрд┐ рдЖрдкрдХрд╛ рдЕрдВрддрд┐рдо рдирд╛рдо рдЕрд▓реЗрдХреНрдЬреЗрдВрдбреНрд░реЗрд╕реНрдХреБ рд╣реИ ред рдЗрд╕ рдЖрд▓реЗрдЦ рдореЗрдВ рджрд┐рдП рдЧрдП рдореВрд▓ рд╕рд┐рджреНрдзрд╛рдВрддреЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдЖрдк рдПрдХ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА, рд▓рдЪреАрд▓рд╛ рдФрд░ рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рдХреЛрдб рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдордХреНрдЦреА рдкрд░ рдЕрдкрдиреЗ рдЖрдк рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП рдкреНрд░рдХрд╛рд░реЛрдВ рдХреА рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдЕрдиреБрдХреВрд▓ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред