рд╢рд╛рдпрдж, рдХрдИ рд╕реА ++ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдиреЗ рдорд▓реНрдЯреАрдорд┐рдереЛрдбреНрд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реБрдирд╛ рд╣реИ рдФрд░ рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдЖрдЬ рддрдХ рдЗрд╕ рднрд╛рд╖рд╛ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рд╕реНрд╡реАрдХрд╛рд░реНрдп рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдирд╣реАрдВ рд╣реИ: рди рддреЛ рднрд╛рд╖рд╛ рд╕рдорд░реНрдерди, рди рд╣реА рдмрд╛рд╣рд░реА рд▓рд╛рдЗрдмреНрд░реЗрд░реАред рд╡рд░реНрдЪреБрдЕрд▓ рдЬреЗрдирд░реЗрдЯрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХреЛрдб рдЬрдирд░реЗрдЯрд░, рдЯреНрд░рд┐рдХреНрд╕ рд╣реИрдВ,
рд╡рд┐рдЬрд╝рд┐рдЯрд░ рдкреИрдЯрд░реНрди рдХреЗ рджреЛрд╣рд░реЗ рдбрд┐рд╕реНрдкреИрдЪрд┐рдВрдЧ рдЙрд░реНрдл тАЛтАЛрдХрд╛ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдорд╛рдорд▓рд╛ред рд▓реЗрдХрд┐рди рдЖрдк рдмрд╕ рдХрдИ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдФрд░ рд╕рдВрдХреЗрдд рджреЗрддреЗ рд╣реИрдВ: рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдпрд╣ рд╕реЗрдЯ - рдПрдХ рдорд▓реНрдЯреАрдорд┐рдереЛрдб рдФрд░ рдПрдХ рдмрд┐рдВрджреБ рд╣реИред
рдореЗрдпрд░реНрд╕ рдФрд░
рдЕрд▓реЗрдХреНрдЬреЗрдВрдбреНрд░реЗрд╕реНрдХреБ рдиреЗ рд▓рдВрдмреЗ рд╕рдордп рд╕реЗ рдорд▓реНрдЯреАрдорд┐рдереЛрдбреНрд╕ рдФрд░ рдЙрдирдХреЗ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдХреБрдЫ рджреГрд╖реНрдЯрд┐рдХреЛрдгреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд▓рд┐рдЦрд╛ рд╣реИред рд▓рдЧрднрдЧ 20 рд╡рд░реНрд╖реЛрдВ рдХреЗ рд▓рд┐рдП, рдЗрди рд╡рд┐рдЪрд╛рд░реЛрдВ рдкрд░ C ++ рдкрд░ рд╡рд┐рднрд┐рдиреНрди рд╕рд╛рд╣рд┐рддреНрдп рдореЗрдВ рдЪрд░реНрдЪрд╛ рдХреА рдЧрдИ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрднреА рднреА рдПрдХ рдкреВрд░реНрдг рд╕рдорд╛рдзрд╛рди рддрдХ рд╡рд┐рдХрд╕рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдЬреЛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ рдЖрд╕рд╛рдиреА рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ ...
рдореИрдВрдиреЗ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдкрдиреА рджреГрд╖реНрдЯрд┐ рдФрд░ рдЗрд╕реЗ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХреА рдкреЗрд╢рдХрд╢ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЕрдкрдиреА рдХрд┐рд╕реНрдордд рдЖрдЬрдорд╛рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред рдкрд░рд┐рдгрд╛рдо рдЕрдХреЗрд▓реЗ рд╣реЗрдбрд░ рдкрд░ рдПрдХ рдЯреЗрдореНрдкрд▓реЗрдЯ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдерд╛ред
рдпрд╣ C ++ 03 рдорд╛рдирдХ рдХреЗ рддрд╣рдд рдПрдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИ, рд╢реБрджреНрдз C ++ рдореЗрдВ: рдмрд┐рдирд╛ рдХрд┐рд╕реА рдХреЛрдб рдЬрдирд░реЗрдЯрд░ рдпрд╛ рдкрд░рд┐рд╡рд░реНрдзрди рдХреЗред рд▓рдХреНрд╖реНрдп рдПрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдПрдХ рд╕рд░рд▓ рдФрд░ рд╕рд╣рдЬ рдЬреНрдЮрд╛рди рдпреБрдХреНрдд рдЕрдВрддрд░рдлрд▓рдХ рд╣реИ рдЬреЛ рд░рдирдЯрд╛рдЗрдо рдХреЗ рд╕рдордп (рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдореВрд▓реНрдп рдХреЗ рдЕрдиреБрд╕рд╛рд░) рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдУрд╡рд░рд▓реЛрдб рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдХреЛ рдорд╣рд╕реВрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИ (рдпрд╣ рдПрдХ рдиреНрдпреВрдирддрдо рдХрд╛рд░реНрдпрдХреНрд░рдо рдерд╛, рдЕрдВрдд рдореЗрдВ рдореБрдЭреЗ рдмрд╣реБрдд рд╕рд╛рд░реА рдЕрдЪреНрдЫрд╛рдЗрдпрд╛рдБ рдорд┐рд▓реАрдВ)ред
рдкрд░реАрдХреНрд╖рдг рдбреНрд░рд╛рдЗрд╡ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ
рд╕реНрд░реЛрддреЛрдВ рдХреЛ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдФрд░ #include рдХреА рдПрдХ рдЬреЛрдбрд╝реА рдмрдирд╛рдПрдВред
рдореИрдВрдиреЗ рд╕рд░рд▓ рд╕реЗ рдЬрдЯрд┐рд▓ рддрдХ рдХреА рдкреНрд░рд╕реНрддреБрддрд┐ рдХреЛ рдЪреБрдирд╛ред рдЗрд╕рд▓рд┐рдП, рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдореИрдВ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд╕рдмрд╕реЗ рд╕рд░рд▓ рддрд░реАрдХреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реВрдВрдЧрд╛ рдФрд░ рдЕрдм рддрдХ рдореИрдВ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рддрдХрдиреАрдХреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдирд╣реАрдВ рдХрд░реВрдВрдЧрд╛ред
рдорд▓реНрдЯреАрдорд┐рдереЛрдб рдХреНрдпрд╛ рд╣реИ?
рдЗрд╕рдХреЗ рдХрдИ рдкрд░реНрдпрд╛рдпрд╡рд╛рдЪреА рд╣реИрдВ: рдПрдХрд╛рдзрд┐рдХ рдкреНрд░реЗрд╖рдг, рдХрдИ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕реНрд╡рд┐рдЪрд┐рдВрдЧ, рд░рдирдЯрд╛рдЗрдо рдкрд░ рдлрд╝рдВрдХреНрд╢рди рдЕрдзрд┐рднрд╛рд░ред рдЗрдВрдЯрд░рдиреЗрдЯ рдФрд░ рд╕рд╛рд╣рд┐рддреНрдп рдкрд░ рдЗрд╕ рд╡рд┐рд╖рдп рдкрд░ рдмрд╣реБрдд рд╕рд╛рд░реА рдЬрд╛рдирдХрд╛рд░реА рд╣реИ, рдЗрд╕рд▓рд┐рдП, рдореИрдВ рдПрдХ рд╣реА рдЪреАрдЬрд╝ рдХреЛ рдкрд╛рд░ рдирд╣реАрдВ рдХрд░реВрдВрдЧрд╛, рд▓реЗрдХрд┐рди рдореИрдВ рдХреБрдЫ рд▓рд┐рдВрдХ рдкреНрд░рджрд╛рди рдХрд░реВрдВрдЧрд╛:
рдЕрдВрдЧреНрд░реЗрдЬреА рдФрд░
рд░реВрд╕реА рд╡рд┐рдХрд┐рдкреАрдбрд┐рдпрд╛ред
C ++ рдореЗрдВ рдорд▓реНрдЯреАрдорд┐рдереЛрдбреНрд╕ рдХреНрдпреЛрдВ?
рдореИрдВ рдЗрд╕ рдореБрджреНрджреЗ рдХрд╛ рдЦреБрд▓рд╛рд╕рд╛ рдирд╣реАрдВ рдХрд░реВрдВрдЧрд╛ред
рдореИрдВ рдЖрдкрдХреЛ рддреБрд░рдВрдд рд╕реВрдЪрд┐рдд рдХрд░ рджреВрдВрдЧрд╛ рдХрд┐ рд▓рдХреНрд╖реНрдп рдорд▓реНрдЯреАрдорд┐рдереЛрдб рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдкреНрд░рдпрд╛рд╕ рдерд╛, рдФрд░ рд╕реА ++ рдореЗрдВ рдЙрдирдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рдФрдЪрд┐рддреНрдп рдХреЗ рд╕рд╛рде рдЕрдореВрд░реНрдд рддрд░реНрдХ рдирд╣реАрдВ рд╣реИред рдХрд┐рд╕реА рдХреЛ рдЬрд░реВрд░рдд рд╣реИ, рд▓реЗрдХрд┐рди рдХрд┐рд╕реА рдХреЛ рдирд╣реАрдВред рдпрджрд┐ рдХреЛрдИ рдореБрд╣рд╛рд╡рд░рд╛ рд╣реИ, рддреЛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдЕрдзрд┐рдХрд╛рд░ рдореМрдЬреВрдж рд╣реИ, рдЪрд╛рд╣реЗ рдХреЛрдИ рдЗрд╕реЗ рдкрд╕рдВрдж рдХрд░реЗ рдпрд╛ рдирд╣реАрдВред рдЪреВрдВрдХрд┐ рдЕрдиреНрдп рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рднрд╛рд╖рд╛ рдпрд╛ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреА рдУрд░ рд╕реЗ рдРрд╕реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП C ++ рдмрджрддрд░ рд╣реИ?
рд╡реИрд╕реЗ, рд╕реА ++ рдХрд┐рд╕реА рджрд┐рди рднрд╛рд╖рд╛ рдкрдХреНрд╖ рд╕реЗ рдорд▓реНрдЯреАрдорд┐рдереЛрдб рдХрд╛ рд╕рдорд░реНрдерди рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдпрд╣рд╛рдБ Bj├╢rn Straustrup рдХреА
рдкреЗрд╢рдХрд╢ рд╣реИ ред рдкрд╣рд▓реЗ, рд╕рднреА рдХреЛ C ++ 0x рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рдЕрдкрдиреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдХреА рдЙрдореНрдореАрдж рдереА, рд▓реЗрдХрд┐рди рдЕрднреА рддрдХ рдЗрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рдкрд░ рдареАрдХ рд╕реЗ рдХрд╛рдо рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
рдЕрдкрдиреЗ рдЖрдк рд╕реЗ рдореИрдВ рдЬреЛрдбрд╝ рд╕рдХрддрд╛ рд╣реВрдБред рд╕реНрдЯреНрд░реЗрдВрд╕реЗрдк рдХреА рд╕рд┐рдлрд╛рд░рд┐рд╢ рд╣реИ рдХрд┐, рдЬрдм рднреА рд╕рдВрднрд╡ рд╣реЛ, рдЖрдВрддрд░рд┐рдХ рд╕рджрд╕реНрдпреЛрдВ рдХреЗ рддрд░реАрдХреЛрдВ рдХреЗ рдмрдЬрд╛рдп, рдореБрдХреНрдд рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╡рд░реАрдпрддрд╛ рджреА рдЬрд╛рддреА рд╣реИ, рдпрджрд┐ рдРрд╕рд╛ рдлрд╝рдВрдХреНрд╢рди рд╡рд░реНрдЧ рдХреЗ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдЕрдЧрд░ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдмрд╣реБрд░реВрдкреА рддрд░реНрдХ рдХреЛ рд╕рдВрднрд╛рд▓рдирд╛ рдЪрд╛рд╣рд┐рдП? рд╣рд░ рдмрд╛рд░ рдЖрдкрдХреЛ рдПрдХ рдирдпрд╛ рд╡рд░реНрдЪреБрдЕрд▓ рддрд░реАрдХрд╛ рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛ рдЬреЛ рдкреВрд░реЗ рдкрджрд╛рдиреБрдХреНрд░рдо (рдпрд╛ рдЗрд╕рдХреЗ рднрд╛рдЧ) рдХреЛ рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдпрд╣ рдбреЗрдЯрд╛ рдФрд░ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рддрдВрдЧ рдХрдиреЗрдХреНрд╢рди рдХреА рдПрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИред рдорд▓реНрдЯреАрдорд┐рдереЛрдб рдЗрд╕ рдирд┐рд░реНрднрд░рддрд╛ рд╕реЗ рдмрдЪрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВ, рд╡рд░реНрдЧ рдкрджрд╛рдиреБрдХреНрд░рдо рдХреЗ рд╕рд╛рде рд╣рд╕реНрддрдХреНрд╖реЗрдк рдХрд┐рдП рдмрд┐рдирд╛ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВред рдпрд╣реА рд╣реИ, рдЖрдВрддрд░рд┐рдХ рдЖрднрд╛рд╕реА рддрд░реАрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдмрд┐рдирд╛, рдЖрдк рдПрдХ рдмрд╛рд╣рд░реА рдЖрднрд╛рд╕реА рд╡рд┐рдзрд┐ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдПрдХ рд╕реЗ рдирд╣реАрдВ, рдмрд▓реНрдХрд┐ рдХрдИ рдмрд╣реБрд░реВрдкреА рддрд░реНрдХреЛрдВ рд╕реЗред рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдЖрд╡реЗрджрди рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдХрд╛рдлреА рд╡рд┐рд╕реНрддреГрдд рд╣реЛрддрд╛ рд╣реИред
рдереЛрдбрд╝рд╛ рдЗрддрд┐рд╣рд╛рд╕
рдкрд╣рд▓реА рдмрд╛рд░ рдореИрдВрдиреЗ 2009 рдореЗрдВ рдорд▓реНрдЯреАрдорд┐рдереЛрдб рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реАрдЦрд╛, "рдЧрдВрдЧреНрд╕ рдСрдл рдлреЛрд░",
"рддрдХрдиреАрдХ рдлреЙрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдУрд░рд┐рдПрдВрдЯреЗрдб рдбрд┐рдЬрд╛рдЗрди " рдкреБрд╕реНрддрдХ рд╕реЗ рд╕реА ++ рдФрд░ рдбрд┐рдЬрд╛рдЗрди рддрдХрдиреАрдХреЛрдВ рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд░рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ
ред рдбрд┐рдЬрд╛рдЗрди рдкреИрдЯрд░реНрдиред "рдЖрдЧрдВрддреБрдХ" рдЕрдиреБрднрд╛рдЧ рдореЗрдВред рдЙрд╕ рд╕рдордп, рдпрд╣ рдореБрдЭреЗ рдЕрдЬреАрдм рд▓рдЧрд╛ рдХрд┐ C ++ рдХреЗ рд▓рд┐рдП рдорд▓реНрдЯреАрдорд┐рдереЛрдб рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдХреЛрдИ рднреА рд╕рдордЭрджрд╛рд░ рдФрд░ рд╕рд░рд▓ рдирд╣реАрдВ рд╣реИред рдореИрдВрдиреЗ рдЕрдкрдиреЗ рдЦрд╛рд▓реА рд╕рдордп рдореЗрдВ рдПрдХ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдХреЛ рд╕реНрдХреЗрдЪ рдХрд┐рдпрд╛ рдФрд░ рдЗрд╕реЗ рд╡рд┐рдХрд╕рд┐рдд рдХрд┐рдпрд╛ (рдЗрд╕реЗ рд▓рдЧрднрдЧ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдХрдИ рдмрд╛рд░ рд▓рд┐рдЦрдХрд░) рдПрдХ рд╣реЙрдмреА рдХреЗ рд░реВрдк рдореЗрдВ, рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдЕрдзреНрдпрдпрди рдХрд┐рдпрд╛ рдФрд░ рднрд╛рд╖рд╛ рдореЗрдВ рдЧрд╣рд░рд╛ рд╣реБрдЖред рдЬрдм рдореБрдЭреЗ рдЕрд▓реЗрдХреНрдЬреЗрдВрдбреНрд░реЗрд╕реНрдХреБ рдкрдврд╝рдиреЗ рдХреЛ рдорд┐рд▓рд╛, рддреЛ рдореБрдЭреЗ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ рдЙрдиреНрд╣реЛрдВрдиреЗ рдорд▓реНрдЯреАрдорд┐рдереЛрдб рдХреЛ рдХрдИ рддрд░реАрдХреЛрдВ рд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рд╣реИред рд▓реЗрдХрд┐рди рд╡реЗ рдмрд╣реБрдд рд╕реАрдорд┐рдд рд╣реЛ рдЧрдП, рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рдореБрд╢реНрдХрд┐рд▓, рдФрд░ рдХреБрдЫ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдмрд┐рд▓реНрдХреБрд▓ рднреА рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рдпрд╣ рдЙрдирдХреА
рдкреБрд╕реНрддрдХ рдХреЗ рд▓рд┐рдП рдореЗрдЯрд╛рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИред рдФрд░ рдЙрдкрд╕рд░реНрдЧ "рдмрд╣реБ" рдмреЗрдХрд╛рд░ рд╣реИ: рдЗрд╕рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗрд╡рд▓ 2 рддрд░реНрдХреЛрдВ рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдореБрдЭреЗ рдХрдИ рдФрд░ рдкреНрд░рдХрд╛рд░ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдорд┐рд▓реЗ, рд▓реЗрдХрд┐рди рдЙрдиреНрд╣реЗрдВ рдХреЛрдб рдЬрдирд░реЗрдЯрд░ рдпрд╛ рдореИрдиреБрдЕрд▓ рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдФрд░ рд╢реЗрдбреНрдпреВрд▓рд┐рдВрдЧ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореЗрд░реЗ рдкрджрд╛рдиреБрдХреНрд░рдо рдореЗрдВ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдкрд░рд┐рд╡рд░реНрддрди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереАред рдпрд╣ рд╕рдм рдЗрддрдирд╛ рдЬрдЯрд┐рд▓ рд╣реИ рдХрд┐ C ++ рдореЗрдВ рдорд▓реНрдЯреАрдорд┐рдереЛрдбреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдХреЛрдИ рдЗрдЪреНрдЫрд╛ рдирд╣реАрдВ рд╣реИред рдореИрдВ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рдмрд╣реБрдд рд╕рд░рд▓ рд░реВрдк рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдХреЗ рдФрд░ рдирд┐рд╖реНрдкрд╛рджрди рдореЗрдВ рд╕реНрд╡реАрдХрд╛рд░реНрдп рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕реЗ рдЗрди рдХрдард┐рдирд╛рдЗрдпреЛрдВ рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рдиреЗ рдХрд╛ рдПрдХ рд░рд╛рд╕реНрддрд╛ рдЦреЛрдЬрдиреЗ рдореЗрдВ рдХрд╛рдордпрд╛рдм рд░рд╣рд╛ред рдЖрдЧреЗ рджреЗрдЦрддреЗ рд╣реБрдП, рдорд▓реНрдЯреАрдорд┐рдереЛрдб рдмрдирд╛рдиреЗ рдХреЗ рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рддрд░реАрдХреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ (рдФрд░ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдмрд╣реБрдд рд╕рд╛рд░реЗ рддрд░реАрдХреЗ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рд╕рд░рд▓ рд╕реЗ рдареАрдХ-рдЯреНрдпреВрдирд┐рдВрдЧ рджреНрд╡рд╛рд░рд╛ рддреИрдпрд╛рд░ рдХрд┐рдП рдЧрдП рдпрд╛ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреА рдиреАрддрд┐рдпрд╛рдВ):
mml::make_multimethod(f1, f2,..., fn)
f1, f2, ..., fn рдлрд╝рдВрдХреНрд╢рдВрд╕ рдпрд╛ рдХреЙрд▓ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЗ рдирд╛рдо рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рдкреБрдирдГ рд▓реЛрдб рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ (рдпрд╛рдиреА, рдЙрдирд╕реЗ рдорд▓реНрдЯреАрдорд┐рдереЛрдб рдЗрдХрдЯреНрдард╛ рдХрд░реЗрдВ)ред рддрд░реНрдХреЛрдВ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдЕрддрд┐рд░рд┐рдХреНрдд рдЖрд╡рд╢реНрдпрдХрддрд╛рдПрдВ рдирд╣реАрдВ рд╣реИрдВ, make_multimethod рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдСрдмреНрдЬреЗрдХреНрдЯ рджреЗрддрд╛ рд╣реИ рдЬреЛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдП рдЧрдП рдорд▓реНрдЯреАрдорд┐рдереЛрдб (рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рдЕрддрд┐рднрд╛рд░рд┐рдд рдлрд╝рдВрдХреНрд╢рди) рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдПрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдХрдо рд╕реАрдорд╛ рд╣реИ, рдЗрд╕рдХреЗ рд▓рд┐рдП рдЕрддрд┐рд░рд┐рдХреНрдд рдЬреНрдЮрд╛рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред
рдирддреАрдЬрддрди, рдПрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛ рдЧрдарди рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рд╢рд╛рдпрдж рдФрд░ рднреА рд╕рднреНрдп, рдореИрдВрдиреЗ рдЗрд╕реЗ
рдЯреНрд░рд╛рдЗрдЯ рдХрд╣рд╛:
рдПрдордПрдордПрд▓ - рдорд▓реНрдЯреАрдореЗрдереЛрдб рд▓рд╛рдЗрдмреНрд░реЗрд░реА ред рдпрд╣ рдЙрд╕рдХреЗ рд▓рд┐рдП рдкреНрд░рдХрд╛рд╢ рдХреЛ рджреЗрдЦрдиреЗ рдХрд╛ рд╕рдордп рд╣реИ, рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ, рд╡рд╣ рдХрд┐рд╕реА рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛ред рдпрд╣ рджреЗрдЦрддреЗ рд╣реБрдП рдХрд┐ рд▓рдЧрднрдЧ 3 рд╡рд░реНрд╖реЛрдВ рдореЗрдВ C ++ рдореЗрдВ рдорд▓реНрдЯреАрдорд┐рдереЛрдбреНрд╕ рдХреЗ рд╕рд╛рде рд╕реНрдерд┐рддрд┐ рдХрд╣реАрдВ рднреА рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдирд╣реАрдВ рд╣реБрдИ рд╣реИ (IMHO, рд╢рд╛рдпрдж рдореБрдЭреЗ рдХреБрдЫ рдкрддрд╛ рдирд╣реАрдВ рд╣реИ)ред
рд╕рдорд╕реНрдпрд╛ рдХрд╛ рдмрдпрд╛рди
рдПрдХ рдорд▓реНрдЯреАрдорд┐рдереЛрдб рдХреЛ рдХреНрдпрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдпрд╣ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЙрд╕реЗ рдпрд╣ рдХреИрд╕реЗ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░, рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд, рдпрд╣ рдХреИрд╕реЗ рджрд┐рдЦреЗрдЧрд╛? рдореИрдВ рдореБрдЦреНрдп рдЙрджреНрджреЗрд╢реНрдп рдкрд░ рдирд┐рд░реНрдорд╛рдг рдХрд░реВрдБрдЧрд╛ -
рд░рди рдЯрд╛рдЗрдо рдкрд░ рдУрд╡рд░рд▓реЛрдб ред рдСрдмреНрдЬреЗрдХреНрдЯ-рдУрд░рд┐рдПрдВрдЯреЗрдб рдУрд╡рд░рд▓реЛрдбрд┐рдВрдЧ рдХреНрдпрд╛ рд╣реИ? рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, C ++ рдореЗрдВ рд╕рдВрдХрд▓рди рдХреЗ рджреМрд░рд╛рди рдлрд╝рдВрдХреНрд╢рди рдУрд╡рд░рд▓реЛрдб рдХреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ? рдЖрдЗрдП рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рддреЗ рд╣реИрдВред
рдЕрдзрд┐рднрд╛рд░ рдирд┐рдпрдореЛрдВ рдХреЗ рд╕рднреА рд╡рд┐рд╡рд░рдгреЛрдВ рдореЗрдВ рдЬрд╛рдиреЗ рдХреЗ рдмрд┐рдирд╛ (рд╡рдВрд╢рд╛рдиреБрдХреНрд░рдо, рдЙрдкрдпреЛрдЧ-рдШреЛрд╖рдгрд╛рдПрдБ, Koenig рдХреА рдЦреЛрдЬ, рдЖрджрд┐ рд╕рд╣рд┐рдд), рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдЙрджрд╛рд╣рд░рдг рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:
void f(int){} void f(double){} void f(char, void*){}
рдпрд╣ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдлрд╝рдВрдХреНрд╢рди рдирд╛рдо f рддрд░реНрдХ рдФрд░ рдЙрдирдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рдкреНрд░рдХрд╛рд░реЛрдВ рд╕реЗ 3 рдЧреБрдирд╛ рдЕрдзрд┐рдХ рд╣реИред рдЗрд╕ рддрдереНрдп рдХреЗ рдмрд╛рд╡рдЬреВрдж рдХрд┐ рдУрдУрдкреА рдХреЗ рд▓рд╛рдн рдХреЗ рд░реВрдк рдореЗрдВ рдлрд╝рдВрдХреНрд╢рди рдУрд╡рд░рд▓реЛрдбрд┐рдВрдЧ рд╕реА ++ рдореЗрдВ рджрд┐рдЦрд╛рдИ рджрд┐рдпрд╛ (рд╕реА рдореЗрдВ рдХреЛрдИ рдЕрдзрд┐рднрд╛рд░ рдирд╣реАрдВ рд╣реИ), рдЗрд╕рдХрд╛ рд░реВрдк рдСрдмреНрдЬреЗрдХреНрдЯ рдУрд░рд┐рдПрдВрдЯреЗрд╢рди рдХреА рддрд░рд╣ рдЧрдВрдз рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдпреЗ 3 рдлрд╝рдВрдХреНрд╢рдВрд╕ рдирд┐рд╣рд┐рдд рд░реВрдк рд╕реЗ рдЬреБрдбрд╝реЗ рд╣реБрдП рд╣реИрдВ: рдирд╛рдореЛрдВ рдХреЗ рд╕рдВрдпреЛрдЧ рд╕реЗ, рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдПрдХ рдкреВрд░реЗ рдХреЗ рд░реВрдк рдореЗрдВ "рдЕрддрд┐рднрд╛рд░рд┐рдд рдлрд╝рдВрдХреНрд╢рди" рд╢рдмреНрдж рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рд▓рд╛рдЧреВ рдирд╣реАрдВ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЗрд╕ рд╕реЗрдЯ рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдПрдХ рдЪрд░ рдореЗрдВ рд╕рд╣реЗрдЬрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ рдпрд╛ рдЗрд╕реЗ рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдкрд╛рд╕ рдХрд░реЗрдВ рдФрд░ рдХрд╣реАрдВ рдмрд╛рдж рдореЗрдВ рдЕрдзрд┐рднрд╛рд░ рдХреЗ рд╕рд╛рде рдХреЙрд▓ рдХрд░реЗрдВ:
auto of = f;
рднрд╛рд╖рд╛ рдХреЗ рдкрд╛рд╕ рдЕрддрд┐рднрд╛рд░рд┐рдд рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╕реЗрдЯ рдХреЛ рдПрдХ рд╣реА рд╡рд╕реНрддреБ рдореЗрдВ рд╕рдВрдпреЛрдЬрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рд╕рд╛рдзрди рдирд╣реАрдВ рд╣реИред рдУрд╡рд░рд▓реЛрдб рдХреЗ рдЗрд╕ рд░реВрдк рдХреЛ рдЗрдВрдХрд╛рд░ рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдПрдХ рд╡рд╕реНрддреБ рдЙрдиреНрдореБрдЦ рд╡рд┐рдХрд▓реНрдк рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:
struct f { void operator()(int) const {} void operator()(double) const {} void operator()(char, void*) const {} }; auto of = f();
рдЖрдк рд╕реЛрдЪ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╕рднреА рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдЕрдм рдПрдХ рдлрд╝рдирдХрд╛рд░ (рдХрд╛рд░реНрдпрд╛рддреНрдордХ рд╡рд╕реНрддреБ) рдХреЗ рд░реВрдк рдореЗрдВ рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдпрд╣ рд╕рд╛рдорд╛рдиреНрдп рдЬреНрдЮрд╛рди рд╣реИ рдпрджрд┐ рдпрд╣ рдЙрдЪрд┐рдд рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдорд╛рдирдХ рдПрд▓реНрдЧреЛрд░рд┐рджрдо, рдЖрджрд┐ рдХреЗ рд▓рд┐рдП рд╡рд┐рдзреЗрдп рдкрд╛рд░рд┐рдд рдХрд░рддреЗ рд╕рдордп рдЗрдирд▓рд╛рдЗрдирд┐рдВрдЧ рдХреЗ рд▓рд╛рднреЛрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛, рд▓реЗрдХрд┐рди рд╕рднреА рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВред рд╕рд╛рдорд╛рдиреНрдп рдЕрдЪреНрдЫреЗ рдкреБрд░рд╛рдиреЗ рдХрд╛рд░реНрдп рдХреЗ рдмрдЬрд╛рдп рдПрдХ рдлрд╝рдирдХрд╛рд░ рдХреА рдПрдХ рдЕрдиреБрдЪрд┐рдд рд╡рд░реНрддрдиреА, рдЕрд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ, рд╕рдордп рд▓реЗрдиреЗ рд╡рд╛рд▓реА рд╣реЛрдЧреА рдФрд░ рдХреБрдЫ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрд╕реНрд╡реАрдХрд╛рд░реНрдп рд╕рдорд╛рдзрд╛рди рднреА рд╣реЛрдЧреАред
рддреЛ, рдПрдХ рд╡рд╕реНрддреБ-рдЙрдиреНрдореБрдЦ рд╢реИрд▓реА рдореЗрдВ, рдПрдХ рдЕрддрд┐рднрд╛рд░рд┐рдд рдлрд╝рдВрдХреНрд╢рди рдСрдкрд░реЗрдЯрд░ () рдХреЗ рд╕рд╛рде рдПрдХ рдлрдВрдХреНрд╢рдирд▓ (рдЙрд░реНрдл рдПрдХ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рд╡рд╕реНрддреБ) рд╣реИред рдПрдордПрдордПрд▓ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдореЗрдВ рдПрдХ рддреИрдпрд╛рд░ рдЙрдкрдпреЛрдЧреА рдЯреЗрдореНрдкрд▓реЗрдЯ рд╣реИ рдЬреЛ рдХрдИ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдХреЙрд▓ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╕рдВрд╕реНрдерд╛рдУрдВ рдХреЛ рд▓рдкреЗрдЯрддрд╛ рд╣реИ (рдпреЗ рдлрд╝рдВрдХреНрд╢рдирд▓рд░реНрд╕, рд▓реИрдореНрдмреНрдбрд╛ рдФрд░ рд╕рд╛рдзрд╛рд░рдг рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдкреЙрдЗрдВрдЯрд░реНрд╕ рд╣реИрдВ) рдФрд░ рдЙрдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХреЗ рд▓рд┐рдП рдУрд╡рд░рд▓реЛрдбреЗрдб рдСрдкрд░реЗрдЯрд░ () рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ overloaded_function <F1, ... Fn> рдФрд░ рдПрдХ рдлрд╝рдВрдХреНрд╢рди make_overloaded_function (f1, ..., fn) рд╣реИ, рдЬреЛ рдЕрдкрдиреЗ рддрд░реНрдХреЛрдВ рдХреЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЕрдкрдиреЗ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдХреЗ рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рддрд╛ рд╣реИред
overloaded_function рдПрдХ рдЗрдХрд╛рдИ рд╣реИ рдЬреЛ рд╕рдВрдХрд▓рд┐рдд рд╕рдордп рдкрд░ рдПрдХ рдЕрддрд┐рднрд╛рд░рд┐рдд рдлрд╝рдВрдХреНрд╢рди рд╣реИ рдЬрд┐рд╕реЗ рдСрдкрд░реЗрдЯрд░ () рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд╣рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЙрдиреНрд╣реАрдВ рдХрд╛рд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдорд▓реНрдЯреАрдорд┐рдереЛрдб рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд░рддреЗ рд╕рдордп рдЖрдЧреЗ рдмрдврд╝рдирд╛ рд╣реЛрдЧрд╛ред рдпрд╛рдиреА рдпрд╣ рдХреБрдЫ рдХреЙрд▓ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдЗрдХрд╛рдИ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдмрд╛рд╣рд░реА рд░реВрдк рд╕реЗ рдУрд╡рд░рд▓реЛрдбреЗрдб рдлрд╝рдиреНрдХреНрдЯрд░ рдХреА рддрд░рд╣ рджрд┐рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЧрддрд┐рд╢реАрд▓ рдкреНрд░рдХрд╛рд░ рдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд░рдирдЯрд╛рдЗрдо рдкрд░ рдУрд╡рд░рд▓реЛрдб рдкреНрд░рджрд░реНрд╢рди рдХрд░рдирд╛, рдЬреЛ рдХрд┐ рд╕рдВрдХрд▓рди рд╕рдордп рдкрд░ рдЕрдЬреНрдЮрд╛рдд рд╣реИред рдорд▓реНрдЯреАрдорд┐рдереЛрдб рдПрдХ рд╡рд╕реНрддреБ-рдореВрд▓реНрдп рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЗрд╕рдореЗрдВ рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рдбреЗрдЯрд╛ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ, рдЕрд░реНрдерд╛рддреНред рдЕрд╕рд╛рдЗрди рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░реЗрдВред рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдФрд░ рд╡реНрдпрд╡рд╣рд╛рд░ рдорд▓реНрдЯреАрдорд┐рдереЛрдб рдХреЛ рдПрдХ рдирд┐рдпрдорд┐рдд рд░реВрдк рд╕реЗ рдмреБрд▓рд╛рдпрд╛ рдЗрдХрд╛рдИ рдХреА рддрд░рд╣ рджрд┐рдЦрдиреЗ рдФрд░ рдПрд╕рдЯреАрдПрд▓, рдмреВрд╕реНрдЯ рдХреЗ рд╕рд╛рде-рд╕рд╛рде рдХрдИ рдПрд╕рдЯреАрдПрд▓ рдЬреИрд╕реЗ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдФрд░ рд╡рд┐рд╢реЗрд╖ рдЕрдиреБрдХреВрд▓рди рдХреЗ рдмрд┐рдирд╛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛрдб рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ред
рдХреБрд▓ред рд╣рдореЗрдВ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрдерди рдорд┐рд▓рддрд╛ рд╣реИ: рдПрдХ рдХреЙрд▓ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдЗрдХрд╛рдИ рдХреЛ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рд╕рдореЗрдВ рд╕реНрдЯреИрдЯрд┐рдХрд▓реА (рд╕рдВрдХрд▓рд┐рдд рд╕рдордп рдкрд░) рдУрд╡рд░рд▓реЛрдб рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдПрдХ рд╕реЗрдЯ рд╢рд╛рдорд┐рд▓ рд╣реЛрдЧрд╛, рдПрдХ рдХреЙрд▓ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкреНрд░рджрд╛рди рдХрд░реЗрдЧрд╛, рдЬрдмрдХрд┐ рд░рдирдЯрд╛рдЗрдо рдХреЗ рджреМрд░рд╛рди рд╕реЗрдЯ рд╕реЗ рд╡рд╛рдВрдЫрд┐рдд рд▓рдХреНрд╖реНрдп рд╕реНрдерд┐рд░ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдЖрдиреЗ рд╡рд╛рд▓реА рдХреЙрд▓реЛрдВ рдХреЛ рднреЗрдЬрдирд╛ред
рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рд╕рдорд╛рдзрд╛рди
рдореИрдВ рд╕реНрд╡рдпрдВ рдорд▓реНрдЯреАрдорд┐рдереЛрдб рдХреЗ рдЕрд▓рд╛рд╡рд╛ рд╕рдорд╕реНрдпрд╛ рдХреЗ рд╕рдмрд╕реЗ рд╕рд╛рдорд╛рдиреНрдп рд╕рдорд╛рдзрд╛рди рдХреЗ рд▓рд┐рдП рдХрдХреНрд╖рд╛рдУрдВ, рд░рдгрдиреАрддрд┐рдпреЛрдВ, рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рд╡рд░реНрдЧреЛрдВ, facades, рдПрдбреЗрдкреНрдЯрд░ рдФрд░ рдЕрдиреНрдп рдЙрдкрдпреЛрдЧрд┐рддрд╛рдУрдВ рдХрд╛ рдПрдХ рд╕реЗрдЯ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдореЗрдВ рдХрд╛рдордпрд╛рдм рд░рд╣рд╛ред рд▓реЗрдХрд┐рди, рдХреНрдпреЛрдВрдХрд┐ рдкрд░рд┐рдЪрдпрд╛рддреНрдордХ рд▓реЗрдЦ, рдЕрднреА рдХреЗ рд▓рд┐рдП рдореИрдВ рдорд▓реНрдЯреАрдорд┐рдереЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рддрд░реАрдХреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реВрдБрдЧрд╛, рддрдерд╛рдХрдерд┐рдд рдХрдо рд╕реАрдорд╛ред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рд▓рдХреНрд╖реНрдп
рдХреЙрд▓ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╕рдВрд╕реНрдерд╛рдУрдВ рдХреЗ рд╕реЗрдЯ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЗрд╕реЗ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП
рдорд▓реНрдЯреАрдорд┐рдереЛрдб рдореБрдЦреМрдЯрд╛ рдФрд░ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рддреИрдпрд╛рд░ рдХрд┐рдпрд╛
make_multimethod ред рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛ рдореВрд▓ рдкреНрд░реЗрд╖рдгрдХрд░реНрддрд╛ рд╡рд░реНрдЧ рд╣реИ, рдЬрд┐рд╕рдХреА рдЪрд░реНрдЪрд╛ рдореИрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд▓реЗрдЦреЛрдВ рдореЗрдВ рдХрд░реВрдВрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рдЧрд╣рд░рд╛рдИ рддрдХ рдЬрд╛рддрд╛ рд╣реВрдВ, рдпрд╣ рдЕрдзрд┐рдХрддрдо рд░реВрдк рд╕реЗ рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рд╣реИ рдФрд░ рдХреЗрд╡рд▓ рдорд▓реНрдЯреАрдорд┐рдереЛрдб рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рддрдХ рд╕реАрдорд┐рдд рдирд╣реАрдВ рд╣реИ, рдорд▓реНрдЯреАрдорд┐рдереЛрдб рдбрд┐рд╕реНрдкреИрдЪрд░ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЛ рдЖрд╕рд╛рди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдореБрдЦреМрдЯрд╛ рд╣реИред
рд╢рд╛рдпрдж рдкрд░реНрдпрд╛рдкреНрдд рддрд░реНрдХ, рдпрд╣ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реИ рдХрд┐ рдпрд╣ рдХрд┐рддрдирд╛ рд╕рд░рд▓ рд╣реИред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдПрдХ рд╕рд░рд▓ рдкрджрд╛рдиреБрдХреНрд░рдо рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдореИрдВ рдПрдХ рдХреНрд▓рд╛рд╕рд┐рдХ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реВрдВрдЧрд╛: рдПрдХ рдЧреЗрдо рдЬрд┐рд╕рдореЗрдВ рд╣рдо рдЕрдВрддрд░рд┐рдХреНрд╖ рдпрд╛рди, рдХреНрд╖реБрджреНрд░рдЧреНрд░рд╣ рдФрд░ рдЕрдВрддрд░рд┐рдХреНрд╖ рд╕реНрдЯреЗрд╢рди рдЯрдХрд░рд╛рдПрдВрдЧреЗ:
рдЕрдиреБрдХреНрд░рдо struct game_object { virtual ~game_object() { } }; struct space_ship : game_object { }; struct space_station : game_object { }; struct asteroid : game_object { };
рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП, рдПрдХ рдРрд╕рд╛ рдХрд╛рд░реНрдп рдЬреЛ рдЧреЗрдо рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдореЗрдВ рдкреЙрд▓реАрдореЙрд░реНрдлрд┐рдХ рдкреЙрдЗрдВрдЯрд░реНрд╕ рдХреА рдПрдХ рд╕рд░рдгреА рд▓реМрдЯрд╛рддрд╛ рд╣реИ:
get_obj_pointers () vector<game_object*>& get_obj_pointers() { static space_ship ship; static asteroid ast; static space_station station; static vector<game_object*> objs; if (objs.empty()) { objs.push_back(&ship); objs.push_back(&ast); objs.push_back(&station); } return objs; }
рд╕реНрдЯреИрдЯрд┐рдХрд▓реА рдУрд╡рд░рд▓реЛрдб рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рдХреНрд╖реНрдп рдХрд╛ рдПрдХ рд╕реЗрдЯ:
const char* collide_go_go(game_object*, game_object*) { return "Unsupported colliding!"; } const char* collide_sh_sh(space_ship*, space_ship*) { return "Space ship collides with space ship"; } const char* collide_sh_as(space_ship*, asteroid*) { return "Space ship collides with asteroid"; } const char* collide_as_sh(asteroid*, space_ship*) { return "Asteroid collides with space ship"; } const char* collide_as_as(asteroid*, asteroid*) { return "Asteroid collides with asteroid"; }
рд╡реЗ рдХреНрдпрд╛ рдЕрддрд┐рднрд╛рд░рд┐рдд рд╣реИрдВ, рдЖрдк рдкреВрдЫрддреЗ рд╣реИрдВ, рдЙрдирдХреЗ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдирд╛рдо рд╣реИрдВред рд╣рд╛рдВ, рдкрддрд╛ рд▓реЗрдиреЗ рдХреА рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ, рдЕрд▓рдЧред рдЕрдЧрд░ рдХрд┐рд╕реА рдХреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдЖрдк рдПрдХ рд╣реА рдирд╛рдо рджреЗ рд╕рдХрддреЗ рд╣реИрдВ, рдХреЗрд╡рд▓ рдЖрдкрдХреЛ рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдкрддрд╛ рд▓реЗрдиреЗ рдкрд░ рдЕрд╕реНрдкрд╖реНрдЯрддрд╛ рдХреЛ рд╣рд▓ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
рдкрд╣рд▓рд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд┐рдВрджреБред рдПрдХ рдорд▓реНрдЯреАрдорд┐рдереЛрдб рдмрдирд╛рдПрдВ (рдЖрдкрдХреЛ рд╣реЗрдбрд░ рдХрдиреЗрдХреНрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ <mml / generation / make_multimethod.hpp>):
#include <mml/generation/make_multimethod.hpp> auto collide = make_multimethod( collide_go_go , collide_sh_sh , collide_sh_as , collide_as_sh , collide_as_as );
рд╣реЛ рдЧрдпрд╛! рдЯрдХрд░рд╛рдирд╛ - рдПрдХ рдорд▓реНрдЯреАрдорд┐рдереЛрдб рд╣реИред рдЖрдк рдСрдЯреЛ рдХреЗ рдмрд┐рдирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рддреБрд░рдВрдд рдПрдХ рдЯреЗрдореНрдкрд▓реЗрдЯ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдкрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдмрдврд╝рд╛рд╡рд╛ рджреЗ рд╕рдХрддреЗ рд╣реИрдВ :: function <const char * (game_object *, game_object *)> рдЯрдХрд░рд╛рдирд╛ = ... рдпрд╛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдорд▓реНрдЯреАрдорд┐рдереЛрдб <...> рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░реЗрдВред рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдПрдХ рдкреНрд░рдХрд╛рд░ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдирд╛ рдХрд╛рдлреА рдХрдард┐рди рд╣реИ, рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдХрдЯреМрддреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╣реИред рдЗрдирдХреИрдкреНрд╕реБрд▓реЗрдЯрд┐рдВрдЧ рдЗрди (рдмреВрд╕реНрдЯ | std | std :: tr1) :: рдлрд╝рдВрдХреНрд╢рди, рдЖрдк рдХреБрдЫ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдФрд░ рдкреНрд░рджрд░реНрд╢рди рдореЗрдВ рд╕реЗ рдХреБрдЫ рдЦреЛ рджреЗрдВрдЧреЗ (рдиреАрдЪреЗ рдПрдХ рд╡реНрдпрд╛рдЦреНрдпрд╛рддреНрдордХ рдЙрджрд╛рд╣рд░рдг рд╣реЛрдЧрд╛), рд▓реЗрдХрд┐рди, рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдЬреНрдпрд╛рджрд╛рддрд░ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рд╡реНрдпрд╡рд╣рд╛рд░ рд╕рдорд╛рди рд╣реЛрдЧрд╛ред
рджреВрд╕рд░рд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд┐рдВрджреБред рд╣рдо рдПрдХ рдорд▓реНрдЯреАрдорд┐рдереЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рд╣рдо рдЬреЛрдбрд╝реЗ рдореЗрдВ рд╕рднреА рдЦреЗрд▓ рд╡рд╕реНрддреБрдУрдВ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рддреЗ рд╣реИрдВ:
auto& objs = get_obj_pointers(); for (size_t i = 0; i < objs.size(); ++i) for (size_t j = 0; j < objs.size(); ++j) cout << '\t' << collide(objs[i], objs[j]) << endl;
рдирд┐рд╖реНрдХрд░реНрд╖ Space ship collides with space ship Space ship collides with asteroid Asteroid collides with space ship Asteroid collides with asteroid
рдХрдВрд╕реЛрд▓ рдХреЛ рдЖрдЙрдЯрдкреБрдЯ рджрд┐рдЦрд╛рддрд╛ рд╣реИ рдХрд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрд┐рд╕рдХрд╛ рд╕рд╛рдордирд╛ рд╣реБрдЖред рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдкрджрд╛рдиреБрдХреНрд░рдо рдХреЛ рдХрд┐рд╕реА рд╡рд┐рд╢реЗрд╖ рдкреНрд░реЗрд╖рдг рд╕рдорд░реНрдерди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдорд▓реНрдЯреАрдорд┐рдереЛрдб рдХрд┐рд╕реА рд╡рд╕реНрддреБ рдХреЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЧрддрд┐рд╢реАрд▓ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдбрд╛рдпрдиреЗрдорд┐рдХ_рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдЖрдкрдХреЛ RTTI рд╕рдорд░реНрдерди рд╕рдХреНрд╖рдо рдХреЗ рд╕рд╛рде рдХреЛрдб рд╕рдВрдХрд▓рд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
рдкреНрд░рднрд╛рд╡рд╢реАрд▓рддрд╛ рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдПрдХ pseudocode рджреЗрддрд╛ рд╣реВрдВ, рдЬрдм рд╕рдВрдХрд▓рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЙрд▓ рдХреЗ рд╕рдорд╛рди рдорд╢реАрди рдХреЛрдб рджреЗрдЧрд╛ (objs [i], objs [j]):
рдЫрджреНрдо рдХреЛрдб inline const char* collide(game_object* obj1, game_object* obj2) { if (space_ship* sh1 = dynamic_cast<space_ship*>(obj1)) if (space_ship* sh2 = dynamic_cast<space_ship*>(obj2)) return collide_sh_sh(sh1, sh2); else if (asteroid* as2 = dynamic_cast<asteroid*>(obj2)) return collide_sh_as(sh1, as2); else return collide_go_go(sh1, obj2); else if (asteroid* as1 = dynamic_cast<asteroid*>(obj1)) if (space_ship* sh2 = dynamic_cast<space_ship*>(obj2)) return collide_as_sh(as1, sh2); else if (asteroid* as2 = dynamic_cast<asteroid*>(obj2)) return collide_as_as(as1, as2); else return collide_go_go(as1, obj2); else if (space_ship* sh2 = dynamic_cast<space_ship*>(obj2)) return collide_go_go(obj1, sh2); else if (asteroid* as2 = dynamic_cast<asteroid*>(obj2)) return collide_go_go(obj1, as2); else return collide_go_go(obj1, obj2); }
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд░рдирдЯрд╛рдЗрдо рдкрд░ рдУрд╡рд░рд╣реЗрдб рдХреЛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫреЗ рд░реВрдк рд╕реЗ 2 рдбрд╛рдпрдиреЗрдорд┐рдХ_рдХрд╛рд╕реНрдЯ рджреНрд╡рд╛рд░рд╛ рджрд░реНрд╢рд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд╕рдмрд╕реЗ рдЦрд░рд╛рдм - 4 рдкрд░ред
рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдкреЙрд▓реАрдореЙрд░реНрдлрд┐рдХ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЗ рд▓рд┐рдП рдкреЙрдЗрдВрдЯрд░реНрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреА рд╣реИ: рдмрд┐рд▓реНрдЯ-рдЗрди рдФрд░ рд╕реНрдорд╛рд░реНрдЯ рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛-рдкрд░рд┐рднрд╛рд╖рд┐рдд рджреЛрдиреЛрдВ рдХреЗ рд╕рд╛рдеред рд▓рд┐рдВрдХреНрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдореБрдЦреМрдЯрд╛ ref_multimethod (<mml / рдЬрдирд░реЗрд╢рди / make_ref_multimethod.hpp> рдореЗрдВ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд) рд▓рд┐рдЦрд╛:
рдкреЙрд▓реАрдореЙрд░реНрдлрд┐рдХ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЗ рд▓рд┐рдП рд▓рд┐рдВрдХ рдХреА рдПрдХ рд╕рд░рдгреА рдмрдирд╛рдиреЗ рдХреА рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдлрд╝рдВрдХреНрд╢рди:
get_objs_refs () boost::ptr_vector<game_object>& get_objs_refs() { static boost::ptr_vector<game_object> objs; if (objs.empty()) { objs.push_back(new space_ship); objs.push_back(new asteroid); objs.push_back(new space_station); } return objs; }
рд▓рд┐рдВрдХ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд▓рдХреНрд╖реНрдп рдХрд╛рд░реНрдп:
рд╕рдВрдХреЗрдд рдХреЗ рд╕рд╛рде рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рд╣реА рд╕реЗрдЯ, рдХреЗрд╡рд▓ рд▓рд┐рдВрдХ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ const char* collide_ref_go_go(game_object&, game_object&) { return "Unsupported colliding!"; } const char* collide_ref_sh_sh(space_ship&, space_ship&) { return "Space ship collides with space ship"; } const char* collide_ref_sh_as(space_ship&, asteroid&) { return "Space ship collides with asteroid"; } const char* collide_ref_as_sh(asteroid&, space_ship&) { return "Asteroid collides with space ship"; } const char* collide_ref_as_as(asteroid&, asteroid&) { return "Asteroid collides with asteroid"; }
рдЯрдХрд░рд╛рдиреЗ рд╡рд╛рд▓реА рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдПрдХ рд╣реА рдЪрдХреНрд░ рдХреЛ рджреЛрд╣рд░рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ, рдореИрдВрдиреЗ рдЗрд╕реЗ рдПрдХ рдЯреЗрдореНрдкрд▓реЗрдЯ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рд▓рдкреЗрдЯ рджрд┐рдпрд╛:
template <typename F, typename Objs> void collide_tester(F collide, Objs& objs) { for (size_t i = 0; i < 2; ++i) for (size_t j = 0; j < 2; ++j) cout << '\t' << collide(objs[i], objs[j]) << endl; }
рдПрдХ рд╕рдВрджрд░реНрдн рдорд▓реНрдЯреАрдорд┐рдереЛрдб рдмрдирд╛рдПрдВ рдФрд░ рдЙрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ:
#include <mml/generation/make_ref_multimethod.hpp> collide_tester( make_ref_multimethod( collide_ref_go_go , collide_ref_sh_sh , collide_ref_sh_as , collide_ref_as_sh , collide_ref_as_as ) , get_objs_refs() );
рдирд┐рд╖реНрдХрд░реНрд╖ Space ship collides with space ship Space ship collides with asteroid Asteroid collides with space ship Asteroid collides with asteroid
рд╕рдордп рдХреЗ рдмрд░рд╛рдмрд░ рдЫрджреНрдо рдХреЛрдб рдмрд┐рдВрджреБрдУрдВ рдХреЗ рд╕рд╛рде рдкрд┐рдЫрд▓реЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рдорд╛рди рд╣реЛрдЧрд╛ред
рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рд╣реА рдХрд╣рд╛ рд╣реИ рдХрд┐ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рд╡рд╕реНрддреБрдПрдВ рдПрдХ рдЗрдирд▓рд╛рдЗрди рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рдВрдХреЗрдд рдХреЗ рд╕рд╛рде рдЕрдиреБрдХреВрд▓рддрд╛ рдХреА рддреБрд▓рдирд╛ рдХрд░рддреА рд╣реИрдВ рддрд╛рдХрд┐ рд╡реЗ рдПрдореНрдмреЗрдб рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реЛред рдЗрддрдирд╛ рд╣реА рдирд╣реАрдВ, рдЗрдирдореЗрдВ рд╕реЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рд╡рд╕реНрддреБрдУрдВ рдореЗрдВ рдбреЗрдЯрд╛ рд╕рджрд╕реНрдп рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЙрдиреНрд╣реЗрдВ рдЯреНрд░рд┐рдХреА рдПрдореНрдЯреА рдмреЗрд╕ рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝реЗрд╢рди рддрдХрдиреАрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрдВрдЯреЗрдирд░ рдХреА рдореЗрдореЛрд░реА рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рдЖрдВрддреЛрдВ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣рд╛рдБ рдПрдХ рдлрд╝рдирдХрд╛рд░ рдХреЗ рд╕рд╛рде рдорд▓реНрдЯреАрдорд┐рдереЛрдб рдЗрдВрдЯрд░реИрдХреНрд╢рди рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ:
struct collider_sh_as { const char* operator()(space_ship*, asteroid*) const { return "Space ship collides with asteroid"; } }; collide_tester( make_multimethod( collide_go_go , collide_sh_sh , collider_sh_as() , collide_as_sh , collide_as_as ) , get_obj_pointers() );
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдлрдВрдХреНрд╢рдирд▓рд░реНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЙрддрдирд╛ рд╣реА рд╕рд░рд▓ рд╣реИ рдЬрд┐рддрдирд╛ рдХрд┐ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ред рд▓реЗрдХрд┐рди рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ, рдорд▓реНрдЯреАрдорд┐рдереЛрдб рдХрд╛ рдЖрдХрд╛рд░ рдЪреМрдбрд╝рд╛рдИ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдПрдХ рд╕реВрдЪрдХ рдХрдо рд╣реЛрдЧрд╛, рдФрд░ рдХреЛрдИ рднреА рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЙрд▓ рдХреЗ рд╕реНрдерд╛рди рдкрд░ рдХреЛрд▓реЗрдбрд░_рд╢_рд╕ :: рдСрдкрд░реЗрдЯрд░ () рдХреЗ рд╢рд░реАрд░ рдХреЛ рдЖрд╕рд╛рдиреА рд╕реЗ рдПрдореНрдмреЗрдб рдХрд░ рд╕рдХрддрд╛ рд╣реИред
рд▓рд╛рдЗрдмреНрд░реЗрд░реА BOOST_TYPEOF (рдФрд░ collider_sh_as :: рдСрдкрд░реЗрдЯрд░) () рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкреИрд░рд╛рдореАрдЯрд░ рдФрд░ рдХреЙрд▓-рдСрдкрд░реЗрдЯрд░ рдХреЗ рд░рд┐рдЯрд░реНрди рдорд╛рди рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рдЖрдкрдХрд╛ рдХрдВрдкрд╛рдЗрд▓рд░ BOOST_TYPEOF рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдпрд╛ рдЖрдк BOOST_TYPEOF рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╕реНрдЯрдо рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдкрдВрдЬреАрдХреГрдд рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдпрд╛ рдпрд╣ рдЬрд╛рдирдирд╛ рдирд╣реАрдВ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдХреНрдпрд╛ рд╣реИ рддреЛ рдкрд░реЗрд╢рд╛рди рди рд╣реЛрдВред рдЖрдк рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рдкреНрд░рдХрд╛рд░ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕рдХреЗ рд▓рд┐рдП рдХрдИ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рддрд░реАрдХреЗ рд╣реИрдВред рдкреБрд╕реНрддрдХрд╛рд▓рдп рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рдкреНрд░рдХрд╛рд░ рдФрд░ рдлрд╝реНрдпреВрдХреНрдЯрд░ (рдПрдл) рдХреЗ рд░рд┐рдЯрд░реНрди рдорд╛рди рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ:
- рдПрдл :: рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдХ рдлрдВрдХреНрд╢рдирд▓ рдкреНрд░рдХрд╛рд░ рд╕реЗ рдПрдХ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдкреНрд░рдХрд╛рд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ред рдЗрд╕реЗ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП:
struct collider_sh_as { typedef const char* signature(space_ship*, asteroid*); ... }
- рдпрджрд┐ рдкрд┐рдЫрд▓рд╛ рдЯрд╛рдЗрдкрдлрд╝рд╛рдЗрдб рдЧрд╛рдпрдм рд╣реИ, рддреЛ рдпрд╣ F :: result_type, F :: arg1_type, F :: arg2_type, ..., F :: arg n _type: рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдлрд╝рдВрдХреНрдЯрд░ рдХреЗ рдЕрдВрджрд░ рдХреЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдЦреЛрдЬрдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддрд╛ рд╣реИред
struct collider_sh_as { typedef const char* result_type; typedef space_ship* arg1_type; typedef asteroid* arg2_type; ... }
рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдмрдврд╝рд╛рд╡рд╛ :: рдлрд╝рдВрдХреНрд╢рди, рдЬреЛ рдЗрд╕ рддрд░рд╣ рдХреЗ рдЯрд╛рдЗрдбреЗрдлрд╝ рдХреЛ рдирд┐рд░реНрдпрд╛рдд рдХрд░рддрд╛ рд╣реИ, рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд╕рдорд░реНрдерд┐рдд рд╣реИред
- рдпрджрд┐ рд╡реЗ рдЕрдиреБрдкрд╕реНрдерд┐рдд рд╣реИрдВ, рддреЛ рдпрд╣ F :: result_type, F :: argument_type (рдПрдХ unary function рдХреЗ рд▓рд┐рдП), F :: first_argument_type, F :: second_argument_type (рдПрдХ рдмрд╛рдЗрдирд░реА рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП) рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкреНрд░рдХрд╛рд░ рдЦреЛрдЬрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддрд╛ рд╣реИред
struct collider_sh_as { typedef const char* result_type; typedef space_ship* first_argument_type; typedef asteroid* second_argument_type; ... }
рдпрд╛, рдЬреЛ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ:
struct collider_sh_as : std::binary_function<space_ship*, asteroid*, result_type> { ... }
рдЗрд╕ рдкреНрд░рдХрд╛рд░, std :: unary_function, std :: Binary_function рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд╕рдорд░реНрдерд┐рдд рд╣реИред
- рдпрджрд┐ рдкрд┐рдЫрд▓реЗ 3 рдЪрд░рдг рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ BOOST_TYPEOF рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдПрдХ рдЧреИрд░-рдорд╛рдирдХ рдСрдкрд░реЗрдЯрд░ () рдХреЗ рд╕рд╛рде рдХреЛрдИ рднреА рдлрдВрдХреНрд╢рдирд▓ рд╕рдорд░реНрдерд┐рдд рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░, std :: function рдФрд░ C ++ 11 lambdas рд╕рдорд░реНрдерд┐рдд рд╣реИрдВред рдХреБрдЫ рдХрдВрдкрд╛рдЗрд▓рд░реЛрдВ рдХреЛ рдХрд╕реНрдЯрдо рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдкрдВрдЬреАрдХреГрдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдореБрдЭреЗ рдЕрднреА рднреА рд╕рдордЭ рдореЗрдВ рдирд╣реАрдВ рдЖрдпрд╛ рдХрд┐ BOOST_TYPEOF рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдореИрдВрдиреЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдкрдВрдЬреАрдХреГрдд рдирд╣реАрдВ рдХрд┐рдпрд╛, рдФрд░ рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ MSVC 7.1 рдФрд░ рдЙрдЪреНрдЪрддрд░ рдкрд░ рдкреИрд░рд╛рдореАрдЯрд░ рдкреНрд░рдХрд╛рд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИред
рдкрд┐рдЫрд▓реЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ, рдорд▓реНрдЯреАрдорд┐рдереЛрдб рдХреЛ рдПрдХ рд╣реА рдзрдордиреА рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рд╕реЗ рдЗрдХрдЯреНрдард╛ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдпрд╣ рдПрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╕реАрдорд╛ рдирд╣реАрдВ рд╣реИред
рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рд▓рд╛рдЗрдмреНрд░реЗрд░реА 0 рд╕реЗ MML_MAX_ARITY рддрдХ рдХреА рдПрд░рд┐рдЯреА рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддреА рд╣реИред MML_MAX_ARITY 5 рдХреЗ рд▓рд┐рдП рдбрд┐рдлрд╝реЙрд▓реНрдЯред рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рди рдХреЛ рдмрджрд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣реЗрдбрд░ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдЖрдкрдХреЛ рдПрдХ рдореИрдХреНрд░реЛ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
#define MML_MAX_ARITY
nn рдЕрдзрд┐рдХрддрдо рдЕрд░реАрддрд┐ рд╣реИред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП nullary, unary рдФрд░ ternary рдлрд╝рдВрдХреНрд╢рди рдЬреЛрдбрд╝реЗрдВ:
рд╣рдореЗрдВ рдПрдХ рдирдП рдкрд░реАрдХреНрд╖рдХ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЬреЛ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреА рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдзрдХреНрдХрд╛ рджреЗрдЧрд╛:
template <typename F, typename Objs> void collide_tester_var_arg(F collide, Objs& objs) {
рд╣рдо рдПрдХ рдорд▓реНрдЯреАрдорд┐рдереЛрдб рдмрдирд╛рддреЗ рд╣реИрдВ рдФрд░ рдЙрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ:
collide_tester_var_arg( make_multimethod( collide_go_go , collide_sh_sh , collide_sh_as , collide_void , collide_go , collide_sh , collide_as , collide_go_go_go , collide_sh_as_as , collide_sh_as_st ) , get_obj_pointers() );
рдирд┐рд╖реНрдХрд░реНрд╖ Nothing collides Space ship collides with what?! Asteroid collides with what?! Space ship collides with space ship Space ship collides with asteroid Space ship collides with two asteroids Space ship collides with asteroid and space_station
рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдПрдХ рдорд▓реНрдЯреАрдорд┐рдереЛрдб рддрд░реНрдХреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдПрдХ рд╕рд╛рдВрдЦреНрдпрд┐рдХреАрдп рд░реВрдк рд╕реЗ рдЕрддрд┐рднрд╛рд░рд┐рдд рдлрд╝рдВрдХреНрд╢рди рдХреА рддрд░рд╣ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рддрд╛ рд╣реИред
рдЫрджреНрдо рдХреЛрдб рдореЗрдВ рдХрд┐рд░рд╛рдпрд╛-рд╕рдордХрдХреНрд╖ рдпрд╣рд╛рдВ рдЕрдзрд┐рдХ рджрд┐рд▓рдЪрд╕реНрдк рд╣реЛрдЧрд╛, рдпрд╣ рджреГрдврд╝рддрд╛ рд╕реЗ рддрд░реНрдХреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ:
рдЖрдк рдмрд╣реБрд░реВрдкреА рдкреНрд░рдХрд╛рд░ рдФрд░ рдореВрд▓реНрдп рдкреНрд░рдХрд╛рд░ рдорд┐рд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВред рдорд╛рди рдкреНрд░рдХрд╛рд░ рдмрд╕ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рд╣рдо рдХреБрдЫ рдЕрддрд┐рд░рд┐рдХреНрдд рд╡рд╕реНрддреБрдирд┐рд╖реНрда рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдкрд░рд┐рдЪрдп рджреЗрддреЗ рд╣реИрдВ рдЬреЛ рдХрд┐ рдкреНрд░рдХрд╛рд░ int рдХрд╛ рддреАрд╕рд░рд╛ рдкреИрд░рд╛рдореАрдЯрд░ рд▓реЗ рд╕рдХрддреЗ рд╣реИрдВ:
const char* collide_go_go_int(game_object*, game_object*, int) { return "Unsupported colliding with extra int parameter!"; } const char* collide_sh_as_int(space_ship*, asteroid*, int) { return "Space ship collides with asteroid with extra int parameter"; }
рд╕реНрдкрд╖реНрдЯрддрд╛ рдХреЗ рд▓рд┐рдП, рдкрд░реАрдХреНрд╖рдХ рдорд▓реНрдЯреАрдорд┐рдереЛрдб рдХреЛ рдкреНрд░реЗрд╖рд┐рдд рдХрд░реЗрдЧрд╛:
2 рдмрд╣реБрд░реВрдкреА рдкреНрд░рдХрд╛рд░;
3 рдмрд╣реБрд░реВрдкреА рдкреНрд░рдХрд╛рд░;
рдПрдХ рдЧреИрд░-рдмрд╣реБрд░реВрдкреА рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде 2 рдмрд╣реБрд░реВрдкреА:
template <typename F, typename Objs> void collide_tester_non_polymorphic_arg(F collide, Objs& objs) { cout << '\t' << collide(objs[0], objs[1]) << endl; cout << '\t' << collide(objs[0], objs[1], objs[2]) << endl; cout << '\t' << collide(objs[0], objs[1], 1) << endl; }
рд╣рдо рдкрд┐рдЫрд▓реЗ рдФрд░ рдирдП рд▓рдХреНрд╖реНрдп рдХрд╛рд░реНрдпреЛрдВ рдФрд░ рдЙрдкрдпреЛрдЧ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдПрдХ рдорд▓реНрдЯреАрдорд┐рдереЛрдб рдмрдирд╛рддреЗ рд╣реИрдВ:
collide_tester_non_polymorphic_arg( make_multimethod( collide_go_go , collide_sh_sh , collide_sh_as , collide_as_sh , collide_as_as , collide_go_go_go , collide_sh_as_st , collide_sh_as_as , collide_go_go_int , collide_sh_as_int ) , get_obj_pointers() );
рдирд┐рд╖реНрдХрд░реНрд╖ Space ship collides with asteroid Space ship collides with asteroid and space_station Space ship collides with asteroid with extra int parameter
рдореИрдВрдиреЗ рдкрд╣рд▓реА рдФрд░ рджреВрд╕рд░реА рдХреЙрд▓ рдХреЗ рд▓рд┐рдП рд░рдгрдерд╛рдЗрдо рдХреЛ рдмрд░рд╛рдмрд░ рджрд┐рдпрд╛, рддреАрд╕рд░реЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдЧреИрд░-рдмрд╣реБрд░реВрдкреА рддрд░реНрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдЙрдкрд░рд┐ рдХрд╛ рдиреЗрддреГрддреНрд╡ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред
рдХрд╛рдВрд╕реНрдЯреЗрдмрд▓ рдФрд░ рдЕрд╕реНрдерд┐рд░ рдХреНрд╡рд╛рд▓рд┐рдлрд╛рдпрд░ рдкрд░ рдУрд╡рд░рд▓реЛрдбрд┐рдВрдЧ рднреА рд╕рдорд░реНрдерд┐рдд рд╣реИ:
const char* collide_go_cvgo(game_object*, const volatile game_object*) { return "Unsupported colliding!"; } const char* collide_sh_cas(space_ship*, const asteroid*) { return "Space ship collides with const asteroid"; } const char* collide_sh_vas(space_ship*, volatile asteroid*) { return "Space ship collides with volatile asteroid"; } const char* collide_sh_cvas(space_ship*, const volatile asteroid*) { return "Space ship collides with const volatile asteroid"; } template <typename F, typename Objs> void collide_tester_cv(F collide, Objs& objs) { game_object* object = objs[1]; const game_object* c_object = objs[1]; const volatile game_object* cv_object = objs[1]; cout << '\t' << collide(objs[0], object) << endl; cout << '\t' << collide(objs[0], c_object) << endl; cout << '\t' << collide(objs[0], cv_object) << endl; } collide_tester_cv( make_multimethod( collide_sh_as , collide_go_cvgo , collide_sh_cas , collide_sh_vas , collide_sh_cvas ) , get_obj_pointers() ); }
рдирд┐рд╖реНрдХрд░реНрд╖ Space ship collides with asteroid Space ship collides with const asteroid Space ship collides with const volatile asteroid
, . , , . тАж :
template <typename F, typename Objs> void collide_tester_compile_time_optim(F collide, Objs& objs) { space_ship ship; asteroid ast; cout << '\t' << collide(objs[0], &ast) << endl; cout << '\t' << collide(&ship, &ast) << endl; } collide_tester_compile_time_optim( make_multimethod( collide_go_go , collide_sh_sh , collide_sh_as , collide_as_sh , collide_as_as ) , get_obj_pointers() );
рдирд┐рд╖реНрдХрд░реНрд╖ Space ship collides with asteroid Space ship collides with asteroid
-:
, , .. .
, .
, , , boost::function /*std::function*/. тАФ collide((game_object*)&ship, (game_object*)&ast) тАФ .
, boost::shared_ptr, ( ). boost::shared_ptr <mml/casting/sp_dynamic_caster.hpp>.
рдПрдХ рдЙрджрд╛рд╣рд░рдг:
#include <mml/casting/sp_dynamic_caster.hpp> const char* sp_collide_go_go(game_object*, boost::shared_ptr<game_object>) { return "Unsupported colliding!"; } const char* sp_collide_sh_sh(space_ship*, boost::shared_ptr<space_ship>) { return "Space ship collides with smart_ptr space ship"; } struct sp_collider_sh_as { const char* operator()(space_ship*, boost::shared_ptr<asteroid>) const { return "Space ship collides with smart_ptr asteroid"; } }; template <typename F, typename Objs> void sp_collide_tester(F collide, Objs& objs) { boost::shared_ptr<game_object> obj1(new space_ship); boost::shared_ptr<game_object> obj2(new asteroid); cout << '\t' << collide(objs[0], obj1) << endl; cout << '\t' << collide(objs[0], obj2) << endl; } sp_collide_tester( make_multimethod( sp_collide_go_go , sp_collide_sh_sh , sp_collider_sh_as() ) , get_obj_pointers() );
рдирд┐рд╖реНрдХрд░реНрд╖ Space ship collides with smart_ptr space ship Space ship collides with smart_ptr asteroid
:
.
рд▓рд╛рдн
. . , , . . . , .
( 0).
тАФ compile time, .
рдХрдорд┐рдпреЛрдВ
(
). , .. . - . , . , .
, .
рдЙрддреНрдкрд╛рджрдХрддрд╛
тАФ dynamic_cast. dynamic_cast . , - . , ┬лfast_cast┬╗, dynamic_cast . , . , ?
GUI . (inlining) .
, .
Acyclyc Visitor , . dynamic_cast.
, , . ( , ) тАФ .
рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ
C++ 03 BOOST (headers only) 1.45.0 .
рдорд╣рддреНрд╡рдкреВрд░реНрдг! ┬лboost┬╗ ┬лmml┬╗ include- .
┬лboost┬╗ ┬лmml┬╗ include directories,
, .
( Windows):
GCC 3.4.2;
Visual C++ 7.1, 8.0, 9.0, 10.0.
UPD: , , . , . , ( 57 ~190 ). , . , , if-else, .UPD 2: : , C++ . , . , . mejedi .. , .