рдХрд┐рд╕реА рддрд░рд╣ рдпрд╣ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рдХрдИ рдкреНрд░рдгрд╛рд▓рд┐рдпреЛрдВ рдореЗрдВ рдореБрдЭреЗ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдШрдЯрдХ рдореЙрдбрд▓ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рдкрдбрд╝рд╛, рдпрд╛ рдпрд╣ рдмрд╛рдд рдЖрдИ рдХрд┐ рдЙрдиреНрд╣реЗрдВ рдЗрд╕ рдкреНрд░рдгрд╛рд▓реА рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдП, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕рдордЭрд╛ рдЧрдпрд╛ рдерд╛ рдХрд┐ рдЕрдкрдШрдЯрди рдФрд░ рд╕рд┐рд╕реНрдЯрдо рдХреЛрдб рдореЗрдВ рдПрдХ рдореЙрдбреНрдпреВрд▓ рдЕрдзрд┐рдХ рд╕реЗ рдЕрдзрд┐рдХ рдореБрд╢реНрдХрд┐рд▓ рдореМрдЬреВрдж рд╣реИред
рдХреНрдпрд╛ рдпрд╣ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдХреБрдЫ рд▓рд┐рдЦрдиреЗ рдпрд╛ рддреИрдпрд╛рд░ рд╕рдорд╛рдзрд╛рди рд▓реЗрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ? рдкреЛрд╕реНрдЯ рдЗрд╕ рдкреНрд░рд╢реНрди рдХрд╛ рдЙрддреНрддрд░ рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рдкреЛрд╕реНрдЯ рдореЗрдВ "рдХреНрдпреЛрдВ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ" рд╡рд┐рд╖рдп рдкрд░ рдХреЛрдИ рджрд░реНрд╢рди рдирд╣реАрдВ рд╣реЛрдЧрд╛ред
рдХреБрдЫ рдРрд╕рд╛ рд╣реА рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ C ++ 03 рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдерд╛ред рдЗрд╕рдиреЗ рдПрдХ рдШрдЯрдХ / рдкреНрд▓рдЧ-рдЗрди рдореЙрдбрд▓ рд╡рд┐рдХрд╕рд┐рдд рдХрд┐рдпрд╛ рдЬреЛ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рднреАрддрд░ рд░рд╣рддрд╛ рд╣реИред рдореЗрд░реЗ рд▓рд┐рдП, рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдирд╛ рджрд┐рд▓рдЪрд╕реНрдк рд╣реИред 4.7.2 рдореЗрдВ, рдЗрд╕ рд▓реЗрдЦ рдХреА рд╢реБрд░реБрдЖрдд рдХреЗ рд╕рдордп рдЬреЛ рдХреБрдЫ рднреА рдореЗрд░реЗ рд▓рд┐рдП рджрд┐рд▓рдЪрд╕реНрдк рдерд╛, рд╡рд╣ рдкрд╣рд▓реЗ рд╣реА рд╕рд╛рдордиреЗ рдЖ рдЪреБрдХрд╛ рд╣реИ, рдФрд░ рдпрд╣ рдЗрд╕ (2013) рд╡рд░реНрд╖ рдХреА рд╢реБрд░реБрдЖрдд рд╣реИред рдФрд░ рдлрд┐рд░ рдореБрдЭреЗ C ++ 11 рдорд┐рд▓рд╛ ... рдПрдХ рджрд┐рд╢рд╛ рдореЗрдВ рдХрд╛рдо рдХрд░рдиреЗ рдкрд░, рджреВрд╕рд░реЗ рдореЗрдВ рдШрд░ рдкрд░ред C ++ 11 рдХреЗ рд╕рд╛рде рдЦреЗрд▓рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдкреБрд░рд╛рдиреЗ рд▓реЗрдЦ рд╕реЗ рднрд╛рд╖рд╛ рдХреА рдирдИ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рд╕рд╛рде рд╕рд╛рдордЧреНрд░реА рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред рдХреБрдЫ рдЕрд░реНрдереЛрдВ рдореЗрдВ рд╕реА ++ рдореЗрдВ рдПрдХ рд╡реНрдпрд╛рдпрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред рд▓реЗрдХрд┐рди рдХрд┐рд╕реА рдХрд╛рд░рдг рд╕реЗ, рдореИрдВ рдЫрд╣ рдорд╣реАрдиреЗ рд╕реЗ рдЕрдзрд┐рдХ рд╕рдордп рддрдХ рд▓реЗрдЦ рдХреЛ рдЕрдВрдд рддрдХ рд▓рд╛рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рдерд╛, рдФрд░ рд▓реЗрдЦ рдиреЗ рдбреНрд░рд╛рдлреНрдЯ рдореЗрдВ рдЭреВрда рдмреЛрд▓рд╛ рдерд╛ред рд╡рд╣ рдорд┐рд▓ рдЧрдпрд╛, рдиреЗрдлрд╝рдерд▓реАрди рдХреЛ рд╣рд┐рд▓рд╛ рджрд┐рдпрд╛ред рдХреНрдпрд╛ рдЖрдпрд╛ рдЗрд╕ рдкрд░ рдкрдврд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
C ++ 11 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдирд┐рд░реНрдгрдп рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ
рд╣рдордиреЗ рдЗрдВрддрдЬрд╛рд░ рдХрд┐рдпрд╛, рдЗрдВрддрдЬрд╛рд░ рдХрд┐рдпрд╛ рдФрд░ рдЖрдЦрд┐рд░рдХрд╛рд░ C ++ рдЕрдкрдбреЗрдЯ рдЬрд╛рд░реА рд╣реЛрдиреЗ рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рдХрд┐рдпрд╛ред рдПрдХ рдирдпрд╛ рднрд╛рд╖рд╛ рдорд╛рдирдХ рдЬрд╛рд░реА рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ - C ++ 11. рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛ рдХреЗ рдЗрд╕ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рдХрдИ рд░реЛрдЪрдХ рдФрд░ рдЙрдкрдпреЛрдЧреА рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рдпрд╣ рдЕрднреА рднреА рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдореНрдпреВрдЯ рдмрд┐рдВрджреБ рд╣реИ, рд▓реЗрдХрд┐рди рд╕рднреА рдХрдВрдкрд╛рдЗрд▓рд░ рдЗрд╕рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ рдпрд╛ рдЗрд╕рдХрд╛ рдкреВрд░рд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред
рдкрд░рд┐рдЪрдп рдФрд░ рдереЛрдбрд╝рд╛ рджрд░реНрд╢рди
рдпрд╣рд╛рдВ рдпрд╣ рдереЛрдбрд╝реА рдмрд╛рдд рд╣реЛрдЧреА рдХрд┐ рдкреНрд▓рдЧ-рдЗрди рд╕рд┐рд╕реНрдЯрдо рдпрд╛ рдШрдЯрдХ рдореЙрдбрд▓ рдХрд╛ рдпрд╣ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд┐рди рд╕рд┐рджреНрдзрд╛рдВрддреЛрдВ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ рдФрд░ рдЗрд╕реЗ рдХреНрдпреЛрдВ рдЪреБрдирд╛ рдЧрдпрд╛ рд╣реИ, рди рдХрд┐ рджреВрд╕рд░реЗ рддрд░реАрдХреЗ рд╕реЗред рдХреБрдЫ рдкрд╛рдиреА рдбрд╛рд▓рд╛ рдЬрд╛рдПрдЧрд╛: рдореЗрд░реЗ рд╡рд┐рдЪрд╛рд░ред рдпрджрд┐ рдЖрдк рдЗрд╕ рддрд░рд╣ рдХреЗ рджрд╛рд░реНрд╢рдирд┐рдХрддрд╛ рдореЗрдВ рд░реБрдЪрд┐ рдирд╣реАрдВ рд░рдЦрддреЗ рд╣реИрдВ, рддреЛ рд╕рд╛рд╣рд╕рдкреВрд░реНрд╡рдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рдЖрдЧреЗ рдмрдврд╝реЗрдВред
рдЗрдВрдЯрд░рдлреЗрд╕ рдФрд░ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛
рд╡рд░реНрдгрд┐рдд рд╡рд┐рдХрд╛рд╕ рдХрд╛ рдЖрдзрд╛рд░ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕рд┐рд╕реНрдЯрдо рдШрдЯрдХреЛрдВ рдХреА рдмрд╛рддрдЪреАрдд рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реЛрдЧрд╛ред рдЗрд╕ рд╕рдВрджрд░реНрдн рдореЗрдВ рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рдХреЗрд╡рд▓ рд╢реБрджреНрдз рдЖрднрд╛рд╕реА рддрд░реАрдХреЛрдВ рд╕реЗ рдпреБрдХреНрдд C ++ рд╕рдВрд░рдЪрдирд╛ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдордЭрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреБрдЫ рддрд╛рд░реНрдХрд┐рдХ рдЗрдХрд╛рдИ рд╣реЛрдЧреА рдЬрд┐рд╕рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рд╕рдм рдХреБрдЫ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред
рдорд╣рддреНрд╡рдкреВрд░реНрдг рдореБрджреНрджреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ - рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕, рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди, рдореЙрдбреНрдпреВрд▓ рдФрд░ рдЕрдиреНрдп рд╕рдВрд╕реНрдерд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдХреНрдпрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПред рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦ рдореЗрдВ, рдПрдХ рд╕реА-рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдПрдХ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЕрдзрд┐рдХ рд╕реЗ рдЕрдзрд┐рдХ рд╡рд┐рд╢рд┐рд╖реНрдЯрддрд╛ рдкреНрд░рджрд╛рди рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИ рдпрджрд┐, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдк рдХреБрдЫ рдЯреВрд▓ рджреНрд╡рд╛рд░рд╛ рдЙрддреНрдкрдиреНрди рдпреВрдЖрдИрдбреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдореЗрдВ рдЕрдиреБрд╡рд╛рдж рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЖрдк рдПрдХ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдХрд╛ рднреА рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рд╕рдорд╛рдзрд╛рди рдХреЗ рд╕рд╛рде, рд╡рд┐рд╢рд┐рд╖реНрдЯрддрд╛ рдХрдордЬреЛрд░ рд╣реЛрдЧреА, рд▓реЗрдХрд┐рди рдлрд╛рдпрджреЗ рд╣реИрдВ - рдпрд╣ рдиреНрдпреВрдирддрдо, рдЕрдзрд┐рдХ рд╕реЗ рдЕрдзрд┐рдХ рдкреНрд░рджрд░реНрд╢рди рдкрд░ рд╣реИ, рдЬреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рдХрдард┐рди рд╣реИред рдПрдХ рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдХреЗ рдореВрд▓реНрдп рдХреЗ рд░реВрдк рдореЗрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╕реЗ CRC32 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рдПрдХ рдЗрдмреНрд╕реЗ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╣реИ рдФрд░ рдпрд╣ рдХреЙрдорди рдиреЗрдорд╕реНрдкреЗрд╕ рдореЗрдВ рд╣реИред "Common.IBase" рд▓рд╛рдЗрди рд╕реЗ CRC32 рдПрдХ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдмрди рд╕рдХрддрд╛ рд╣реИред рд╣рд╛рдВ, рдпрджрд┐ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдЕрдЪрд╛рдирдХ рдХрд╣реАрдВ рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ uuid рдирд╣реАрдВ рд╣реИ, рддреЛ рдЖрдкрдХреЛ "рдЦреБрд╢" рдбрд┐рдмрдЧрд┐рдВрдЧ рдХреЗ рд▓рдВрдмреЗ рдШрдВрдЯреЗ рдорд┐рд▓реЗрдВрдЧреЗ рдФрд░ рд░реВрд╕реА рднрд╛рд╖рд╛ рдХреЗ рдордЬрдмреВрдд рдкрдХреНрд╖ рдореЗрдВ рдорд╣рд╛рд░рдд рд╣рд╛рд╕рд┐рд▓ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╕рдордп рд╣реЛрдЧрд╛ред рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдЖрдкрдХреА рдХреЛрдИ рдорд╣рддреНрд╡рд╛рдХрд╛рдВрдХреНрд╖рд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЖрдкрдХреЗ рдореЙрдбрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рд╡реИрд╢реНрд╡рд┐рдХ рдкреНрд░рдгрд╛рд▓рд┐рдпреЛрдВ рдореЗрдВ рджреБрдирд┐рдпрд╛ рднрд░ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рддреЛ рд▓рдВрдмреА рдбреАрдмрдЧрд┐рдВрдЧ рдХреЗ рд╕рд╛рде рдкрд░рд┐рдгрд╛рдо рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдХрдо рд╕реЗ рдХрдо рд╣реИред рдХреБрдЫ рдХрд╛рд░реНрдпрд╛рд▓рдпреЛрдВ рдореЗрдВ рдореИрдВрдиреЗ рдЕрдкрдиреЗ "рд╢рд┐рд▓реНрдк" рдХреЛ рдПрдордПрд╕-рдХреЙрдо рдХреА рд╢реИрд▓реА рдореЗрдВ рдирд┐рдкрдЯрд╛рдпрд╛, рдЬрд┐рд╕рдореЗрдВ рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рдорд╛рди рдПрдХ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП рдереЗ рдФрд░ рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рд╕рдорд╕реНрдпрд╛ рдкрд░ рдареЛрдХрд░ рдирд╣реАрдВ рдЦрд╛рддреЗ рдереЗ, рдФрд░ рдРрд╕реА рдЕрдлрд╡рд╛рд╣реЗрдВ рдирд╣реАрдВ рдереАрдВ рдХрд┐ рдХрд┐рд╕реА рдХреЗ рдкрд╛рд╕ рднреА рдереАред рдЗрд╕рд▓рд┐рдП, рдЗрд╕ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рдПрдХ рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдкреНрд░рджрд░реНрд╢рди рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рд╕рдорд╛рдзрд╛рди рд╕реЗ рдПрдХ рдФрд░ рд╕рдХрд╛рд░рд╛рддреНрдордХ рдмрд┐рдВрджреБ рд╣реИ: рдЖрдк рд╕рдВрдХрд▓рди рдХреЗ рд╕рдордп рдПрдХ рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдХреЗ рд╕рд╛рде рдмрд╣реБрдд рд╕рд╛рд░реА рджрд┐рд▓рдЪрд╕реНрдк рдЪреАрдЬреЗрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЛ рд╣реЗрд░рдлреЗрд░ рдХрд░рдиреЗ рд╕реЗ рдЯреЗрдореНрдкрд▓реЗрдЯ рдкреИрд░рд╛рдореАрдЯрд░ рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ, рдФрд░ рдпрд╣ рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд▓рд┐рдП рдЖрд╕рд╛рди рд╣реИред рдФрд░ рдпрд╣рд╛рдВ, рд╕реА ++ 11 рдХреЗ рдкрд╣рд▓реЗ рдкреНрд▓рд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ - рдпрд╣ рдХреЙрдиреНрд╕реНрдЯреИрдХреНрд╕ рд╣реИ, рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рдЖрдк рд╕рдВрдХрд▓рди рдХреЗ рд╕рдордп рд╣реИрд╢ рдХреЗ рдореВрд▓реНрдпреЛрдВ рдХреА рдЧрдгрдирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдХреНрд░реЙрд╕-рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдФрд░ рднрд╛рд╖рд╛ рдХрд╛ рд╕рдорд░реНрдерди
рд╡рд░реНрдгрд┐рдд рдореЙрдбрд▓ рдХреНрд░реЙрд╕-рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рд╣реЛрдЧрд╛ред рдХреБрдЫ рдХреЗ рдкрд╛рд░ рд╡рд╣рд╛рдБ рд╡рд┐рдХрд╛рд╕ рдореЗрдВ рджрд┐рд▓рдЪрд╕реНрдк рдмрд┐рдВрджреБрдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИред C ++ рдбреЗрд╡рд▓рдкрд░ рдХреЗ рд▓рд┐рдП, рд╕рдмрд╕реЗ рд╕рдордЭ рдореЗрдВ рдЖрдиреЗ рд╡рд╛рд▓реЗ рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХреНрд░реЙрд╕-рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдирд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХреНрд░реЙрд╕-рд╕рдВрдХрд▓рди рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдХрд╛рд░реНрдп рдХрдо рдЖрдо рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдПрдХ рдХрдВрдкрд╛рдЗрд▓рд░ рджреНрд╡рд╛рд░рд╛ рдЖрд╕рд╛рдиреА рд╕реЗ рд╕рдорд░реНрдерд┐рдд рд╣реЛрдиреЗ рдкрд░ рджреВрд╕рд░реЗ рдкрд░ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдРрд╕рд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╕рдВрдХрд▓рди рдХреЗ рд╕рдордп рдореЗрдВ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреА рдкреНрд░рд╛рдкреНрддрд┐ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рдкреНрд░рдпрд╛рд╕ рдХреЗ рдШреЛрд╖рдгрд╛рдкрддреНрд░ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕реЗ рдкрд╣рд▓реЗ рд╣реИред рдПрдХ рдЕрдЪреНрдЫрд╛ рдЙрджрд╛рд╣рд░рдг BOOST_TYPEOF рд╣реИред рдпрджрд┐ рдЖрдк BOOST_TYPEOF рдХреЗ "рд╣реБрдб рдХреЗ рдиреАрдЪреЗ" рджреЗрдЦрддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рд▓рд╛рдареА рдФрд░ рдмреИрд╕рд╛рдЦреА рдХрд╛ рдПрдХ рдмрдбрд╝рд╛ рд╕реЗрдЯ рдорд┐рд▓реЗрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдРрд╕реА рдЪреАрдЬрд╝реЛрдВ рдХреЛ C ++ 03 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рдерд╛, рд▓реЗрдХрд┐рди рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рдПрдХ рд╡рд┐рд╢реЗрд╖ рд╕рдВрдХрд▓рдХ рдХреА рдХреБрдЫ рдЙрдиреНрдирдд рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдкрд░ рд╣рд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рд╕реА ++ 11 рдореЗрдВ рднреА, рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рд╣реБрдЖ, рдЬрд┐рд╕рдиреЗ рдзрд╛рд░рд╛рдУрдВ, рддреБрд▓реНрдпрдХрд╛рд▓рди рд╡рд╕реНрддреБрдУрдВ рдЖрджрд┐ рдкрд░ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдЖрд╡рд░рдг рд▓рд┐рдЦрдиреЗ рд╕реЗ рдЗрдирдХрд╛рд░ рдХрд░рдирд╛ рд╕рдВрднрд╡ рдмрдирд╛ рджрд┐рдпрд╛ред рд╣рдо рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рд▓рд┐рдП рдорд╛рдирдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рд╢реЗрд╖ рдзрдиреНрдпрд╡рд╛рдж рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдЙрдиреНрд╣реЛрдВрдиреЗ рдХрдИ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЕрдкрдирд╛ рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░ рджрд┐рдпрд╛ рд╣реИ, рдФрд░, рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд, рдЙрдиреНрд╣реЛрдВрдиреЗ рдПрд╕рдЯреА :: is_pod рдФрд░ рдЕрдиреНрдп рдЬреИрд╕реЗ рддрд░реАрдХреЛрдВ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рджрд┐рдпрд╛ рд╣реИ, рдЬреЛ рдорд╛рдирдХ C ++ 03 рдЯреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рд╕рдВрдХрд▓рдХ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╕рдВрднрд╡ рдирд╣реАрдВ рдерд╛ред
рддреГрддреАрдп-рдкрдХреНрд╖ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ
рддреАрд╕рд░реЗ рдкрдХреНрд╖ рдХреЗ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреА рдЗрдЪреНрдЫрд╛ рдереА рдФрд░ рдпрджрд┐ рд╕рдВрднрд╡ рд╣реЛ, рддреЛ рдЙрдирдХреЗ рдЙрдкрдпреЛрдЧ рдХреЛ рд╢реВрдиреНрдп рддрдХ рдХрдо рдХрд░реЗрдВред рдпрд╣ рд╢реБрджреНрдз C ++ рд╡рд┐рдХрд╛рд╕ рд╣реЛрдЧрд╛ред рдЕрдВрддрд┐рдо рдШрдЯрдХреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╕рдордп, рдХрд┐рд╕реА рднреА рдЪреАрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд╛рд░реНрдп рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдХреЛрдИ рднреА рдкреБрд╕реНрддрдХрд╛рд▓рдп, рд▓реЗрдХрд┐рди рдпрд╣рд╛рдВ рдкреНрд░рд╕реНрддреБрдд рдореЙрдбрд▓ рд╕реНрд╡рдпрдВ рддреГрддреАрдп-рдкрдХреНрд╖ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдЕрд░реНрде рдореЗрдВ рд╢реБрджреНрдз рд╣реЛрдЧрд╛ред
рддреАрд╕рд░реЗ рдкрдХреНрд╖ рдХреЗ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдореЗрд░рд╛ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд░рд╡реИрдпрд╛ рд╣реИ: рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛ рдЙрдкрдпреЛрдЧ рди рдХрд░реЗрдВ рдпрджрд┐ рдЗрд╕рдХреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛрдб рджреНрд╡рд╛рд░рд╛ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╡ рддрд░реАрдХреЗ рд╕реЗ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХреА рдЬрд╛рддреА рд╣реИред рдЖрдкрдХреЛ Qt рдХреЛ рдХреЗрд╡рд▓ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рдирд╣реАрдВ рдЦреАрдВрдЪрдирд╛ рдЪрд╛рд╣рд┐рдП рдХреНрдпреЛрдВрдХрд┐ рдХреБрдЫ рд▓реЛрдЧ QStrung рдФрд░ QList рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдкрд╕рдВрдж рдХрд░рддреЗ рд╣реИрдВред рд╣рд╛рдВ, рдореБрдЭреЗ рдРрд╕реА рдкрд░рд┐рдпреЛрдЬрдирд╛рдПрдВ рдорд┐рд▓реА рд╣реИрдВ рдЬрд┐рдирдореЗрдВ рдХреБрдЫ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдФрд░ рд░реВрдкрд░реЗрдЦрд╛рдУрдВ рдХреЛ рдХреЗрд╡рд▓ рдХреБрдЫ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреА рдЖрджрдд рдХреЗ рдХрд╛рд░рдг рдХреБрдЫ рдЫреЛрдЯреЗ рдФрд░ рдорд╣рддреНрд╡рд╣реАрди рд╣рд┐рд╕реНрд╕реЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рдиреЛрдВ рджреНрд╡рд╛рд░рд╛ рдЦреАрдВрдЪрд╛ рдЧрдпрд╛ рдерд╛ред рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдЗрд╕ рддрд░рд╣ рдХреЗ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЛ рдмрдврд╝рд╛рд╡рд╛ рджреЗрдиреЗ рдХреЗ рд░реВрдк рдореЗрдВ, рдХреНрдпреВрдЯреА, рдкреЛрдХреЛ рдФрд░ рдЕрдиреНрдп рд╕реЗ рдЗрдирдХрд╛рд░ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЙрдиреНрд╣реЗрдВ рдЙрд╕ рд╕реНрдерд╛рди рдкрд░ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдХреЗрд╡рд▓ рддрднреА рд╢рд╛рдорд┐рд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм рдЙрдирдХреА рдмрд╣реБрдд рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдЪрд┐рдбрд╝рд┐рдпрд╛рдШрд░ рд▓рдЧрд╛рдирд╛ рдЙрдЪрд┐рдд рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП, рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рд╡рд┐рджреЗрд╢реА рдЬрд╛рдирд╡рд░реЛрдВ рдХреЗ рдПрдХ рдЬреЛрдбрд╝реЗ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ рдФрд░ рдЕрдзрд┐рдХ рдирд╣реАрдВ :) рддрд╛рдХрд┐ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЛ 5-7 рдпрд╛ рдЙрд╕рд╕реЗ рдЕрдзрд┐рдХ рдкреНрд░рдХрд╛рд░ рдХреА рд▓рд╛рдЗрдиреЗрдВ рди рдорд┐рд▓реЗрдВ, рдЬрд┐рдирдореЗрдВ рд╕реЗ 2-3 рдЖрдкрдХреА рдЕрдкрдиреА рд╕рд╛рдЗрдХрд┐рд▓ рд╣реИрдВ, рдФрд░ рдмрд╛рдХреА рдЕрдиреНрдп рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рд╕реЗ рдЖрдП рдФрд░ рдПрдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕реЗ рджреВрд╕рд░реЗ рдореЗрдВ рдХрдиреНрд╡рд░реНрдЯрд░реНрд╕ рдХрд╛ рдПрдХ рд▓рд┐рдЦрд┐рдд рдЧреБрдЪреНрдЫрд╛ред рдирддреАрдЬрддрди, рдЙрдкрдпреЛрдЧреА рдХрд╛рд░реНрдп рдХреЗ рдмрдЬрд╛рдп рд╡рд┐рдХрд╕рд┐рдд рдХрд╛рд░реНрдпрдХреНрд░рдо, рд╕рдорд╛рди рд╕рдВрд╕реНрдерд╛рдУрдВ рдХреЗ рд╡рд┐рднрд┐рдиреНрди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдиреЛрдВ рдХреЗ рдмреАрдЪ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдиреЗ рдореЗрдВ рдХрд╛рдлреА рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╕рдордп рд╡реНрдпрддреАрдд рдХрд░рддрд╛ рд╣реИред
рдмреЙрд╕ ...
рдХрд┐рд╕реА рддрд░рд╣ рдореБрдЭреЗ рдирд╛рдорд╕реНрдерд╛рдиреЛрдВ рдореЗрдВ рдХреЛрдб рдХреЛ рдЫрд╛рдВрдЯрдиреЗ рдХреА рдЖрджрдд рдкрдбрд╝ рдЧрдИред
рдмреЙрд╕ (рд╕реЗрд╡рд╛ рд╕рдорд╛рдзрд╛рди рдХреЗ рд▓рд┐рдП рдЖрдзрд╛рд░ рдСрдмреНрдЬреЗрдХреНрдЯ) рдХреЛ рдирд╛рдорд╕реНрдерд╛рди рдирд╛рдо рдФрд░ рдкреВрд░реЗ рдореЙрдбрд▓ рдХреЗ рд░реВрдк рдореЗрдВ рдЪреБрдирд╛ рдЬрд╛рдПрдЧрд╛ред рдЖрдк рдЗрд╕ рд╡рд┐рд╖рдп рдкрд░
рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦ рдореЗрдВ рдирд╛рдо рдХреА рдЙрддреНрдкрддреНрддрд┐ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВред рд▓реЗрдЦ рдХреЗ рд▓рд┐рдП рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ, рдпрд╣ рдзреНрдпрд╛рди рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдХрд┐ "рдмреЙрд╕" рдХреЛрдб рдореЗрдВ рднреНрд░рдорд┐рдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдмреЙрд╕ рдХреА рдпрд╛рдж рджрд┐рд▓рд╛рдиреЗ рдФрд░ рдЗрд╕рд╕реЗ рдЬреБрдбрд╝реЗ рд╕реНрдЯреАрд░рд┐рдпреЛрдЯрд╛рдЗрдк рдХреЗ рдХрд╛рд░рдгред рдкреНрд░рд╛рд░рдВрдн рдореЗрдВ, рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд "рдХрдкреНрддрд╛рди" (┬й рд╣рдорд╛рд░рд╛ рд░реВрд╕) рдХреЗ рдирд╛рдо рдкрд░ рдЬреЛрд░ рджреЗрдиреЗ рдХрд╛ рдХреЛрдИ рдЙрджреНрджреЗрд╢реНрдп рдирд╣реАрдВ рдерд╛ред рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдХреЛрдИ рдирдХрд╛рд░рд╛рддреНрдордХ рд╕рдВрдШреЛрдВ рдХрд╛ рдХрд╛рд░рдг рдмрдирддрд╛ рд╣реИ, рддреЛ рдЗрд╕реЗ рдПрдХ рдЕрд▓рдЧ рдХреЛрдг рд╕реЗ рдХреНрдпреЛрдВ рдирд╣реАрдВ рджреЗрдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ? рдХреЗрди рдмреНрд▓реИрдВрдЪрд░реНрдб "рд╕рдлрд▓рддрд╛ рдХреА рдКрдВрдЪрд╛рдЗрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдиреЗрддреГрддреНрд╡" рджреНрд╡рд╛рд░рд╛ рдПрдХ рдЕрджреНрднреБрдд рдкреБрд╕реНрддрдХ рд╣реИ, рдЬреЛ рдЙрдЪреНрдЪ-рдкреНрд░рджрд░реНрд╢рди рд╕рдВрдЧрдардиреЛрдВ рдФрд░ рдиреМрдХрд░ рдиреЗрддрд╛рдУрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рд▓рдХреНрд╖реНрдп рдЕрдзрд┐рдХрддрдо рдЙрддреНрдкрд╛рджрдХрддрд╛ рдХреЗ рд╕рд╛рде рдЕрдкрдиреЗ рдХрд╛рдо рдХреЗ рд▓рд┐рдП рдХрд░реНрдордЪрд╛рд░реА рдХреЛ рд╕рдм рдХреБрдЫ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХрддрдо рдХрд░рдирд╛ рд╣реИ, рдФрд░ рди рдХреЗрд╡рд▓ рдЙрд╕рдХреА рдкреАрда рдХреЗ рдкреАрдЫреЗ рдПрдХ рдЫрдбрд╝реА рдХреЗ рд╕рд╛рде рдЦрдбрд╝рд╛ рд╣реИред рдпрд╛рдиреА рдиреЗрддрд╛ - рдкреНрд░рднрд╛рд╡реА рдХрд╛рд░реНрдп рдХреЗ рдЖрдпреЛрдЬрди рдореЗрдВ рд╕рд╣рд╛рдпрдХред рдмреЙрд╕ рдХреЛ рдПрдХ рдЕрддреНрдпрдзрд┐рдХ рдкреНрд░рднрд╛рд╡реА рд╕рдВрдЧрдарди рдореЗрдВ рдПрдХ рдиреЗрддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рд╡рд╛рдВрдЫрдиреАрдп рд╣реИ рдЬреЛ рдХрд░реНрдордЪрд╛рд░рд┐рдпреЛрдВ рдХреЛ рдЕрдзрд┐рдХрддрдо рдЙрддреНрдкрд╛рджрдХрддрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИ, рдЙрдиреНрд╣реЗрдВ рдЗрд╕рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╕рдм рдХреБрдЫ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдШрдЯрдХ рдореЙрдбрд▓ рдХреЗ рдврд╛рдВрдЪреЗ рдореЗрдВ, рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рд╕рдВрд╕реНрдерд╛рдУрдВ рдХреА рдЖрд╕рд╛рди рдмрд╛рддрдЪреАрдд рдХреЗ рд▓рд┐рдП рдПрдХ рдкрддрд▓реА рдкрд░рдд рдХреЛ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рдиреЗ рдореЗрдВ рдпрд╣ рд╕рдЯреАрдХ рд░реВрдк рд╕реЗ рд╕рд╣рд╛рдпрддрд╛ рдХрд░рддрд╛ рд╣реИ, рди рдХрд┐ рдПрдХ рд░рд╛рдХреНрд╖рд╕реА рдврд╛рдВрдЪреЗ рд╕реЗ рд▓рдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдФрд░ рдЕрдзрд┐рдХрд╛рдВрд╢ рдХрд╛рдо рдХреЗрд╡рд▓ рдЗрд╕рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рдЙрджреНрджреЗрд╢реНрдп рд╕реЗ рд╣реЛрддреЗ рд╣реИрдВ, рдФрд░ рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХ рддрд░реНрдХ рд╕реЗ рдирд╣реАрдВред
рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЗрдВ рдиреНрдпреВрдирддрдо
рдЕрдЧрд▓реЗ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рддреЗ рд╕рдордп рдореЗрд░реЗ рд▓рд┐рдП рдорд╣рддреНрд╡рдкреВрд░реНрдг рдорд╛рдирджрдВрдбреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдорд╛рдирджрдВрдб рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рд╕рд╛рде рдХрд╛рдо рд╢реБрд░реВ рдХрд░рдиреЗ рдФрд░ рдЗрд╕реЗ рдХрд╛рд░реНрдп рдХреЗ рд▓рд┐рдП рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рд╕реЗ рдЕрдзрд┐рдХ рдЙрдиреНрдирдд рд╡рд┐рдХрд▓реНрдк рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреА рдЧрддрд┐ рд╣реИред рдпрд╣реА рд╣реИ, рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЛ рдЕрдкрдиреЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдмрд╣реБрдд рд▓рдВрдмреЗ рдЕрдиреБрд╖реНрдард╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рдЗрд╕рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рд╕рд╛рде рдХреБрдЫ рд╢реБрд░реВ рд╣реЛред рд▓реЗрдХрд┐рди рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ, рдЖрд╡рд╢реНрдпрдХрддрд╛рдиреБрд╕рд╛рд░, рдЗрд╕рдХреЗ рд╕рдорд╛рдпреЛрдЬрди рдФрд░ рдЕрдзрд┐рдХ рдХрдард┐рди рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдЕрдиреБрдХреВрд▓рди рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рд╕реЗ рдЕрдзрд┐рдХ рдЕрд╡рд╕рд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХрд╛ рдЕрд╡рд╕рд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╛рдиреА рдкреНрд░рд╛рд░рдВрдн рдореЗрдВ, рдпрд╣рд╛рдВ рдЖрдкрдХреЗ рд▓рд┐рдП "рдореБрдБрд╣рд╛рд╕реЗ" рдмрдЯрди рд╣реИ, рдЬрд┐рд╕ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рдХреЗ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдЕрдиреБрдХреНрд░рдо рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ, рддреЛ рдпрд╣рд╛рдВ рдмрдЯрди рдФрд░ рд╕реНрд╡рд┐рдЪ рдХрд╛ рдПрдХ рдирд┐рдпрдВрддреНрд░рдг рдХрдХреНрд╖ рд╣реИред рдпрд╣ рд╡рд┐рдЪрд╛рд░ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдореЙрдбрд▓ рдореЗрдВ рдирд┐рд╣рд┐рдд рдореЗрдВ рд╕реЗ рдПрдХ рдерд╛: рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдЪрд░рдгреЛрдВ рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕реЗ рдЬрд┐рддрдирд╛ рд╕рдВрднрд╡ рд╣реЛ рд╕рдХреЗ рдЫрд┐рдкрд╛рдПрдВред рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЗ рдЕрдВрджрд░, рдХреЛрдб рдордирдорд╛рдиреЗ рдврдВрдЧ рд╕реЗ рдЬрдЯрд┐рд▓ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдХреА рд╕рднреА рдЬрдЯрд┐рд▓рддрд╛ рдХреЗ рд╕рд╛рде рдпрд╣ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рдЙрдкрдпреЛрдЧ рдХреА рдЕрдзрд┐рдХрддрдо рдЖрд╕рд╛рдиреА рдХреЛ рд╕рд╣реА рдард╣рд░рд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдХрдИ рд╡рд┐рд░рд╛рд╕рдд
рдЗрдВрдЯрд░рдиреЗрдЯ рдкрд░ рд╡рд╛рд╕реНрддрд╡рд┐рдХрддрд╛рдУрдВ рдХреА рдХрдИ рд╡рд┐рд░рд╛рд╕рдд рдХрд╛ рдЖрдпреЛрдЬрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдФрд░ рдХрдИ рдкрд╡рд┐рддреНрд░ рдпреБрджреНрдзреЛрдВ рдХрд╛ рд╕рдВрдЪрд╛рд▓рди рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рдорд▓реНрдЯреАрдкрд▓ рдЗрдирд╣реЗрд░рд┐рдЯреЗрдВрд╕ C ++ рдХреА рдЦреВрдмрд┐рдпреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИред рд╣рд╛рдВ, рдХреБрдЫ рдЬрдЧрд╣реЛрдВ рдкрд░ рдЙрд╕рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЙрд╕рдХреЗ рдмрд┐рдирд╛, рдЖрд╕рд╛рдиреА рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдирд╛ рднреА рд╣рдореЗрд╢рд╛ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рд╕реА ++ рдЯреВрд▓ рдХреЛ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рд▓реЗрдиреЗ рдФрд░ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдЗрд░рд╛рджрд╛ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдореМрдЬреВрдж рд╣реИ, рд▓реЗрдХрд┐рди рдЬрдм рдЖрд╡рд╢реНрдпрдХрддрд╛ рдЙрддреНрдкрдиреНрди рд╣реЛрддреА рд╣реИ, рддреЛ рдПрдХ рдЙрдкрдХрд░рдг рд╣реЛрддрд╛ рд╣реИред
рдЬрдм рд╡реЗ рдореБрдЭреЗ рдХреЗрд╡рд▓ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреА рдХрдИ рд╡рд┐рд░рд╛рд╕рдд рдХреЗ рд╕рд╛рде рднрд╛рд╖рд╛рдУрдВ рдХреЗ рдлрд╛рдпрджреЗ рдХреЗ рд▓рд┐рдП рдЧрд╛рдирд╛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдореИрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рдорд╕реНрдпрд╛ рдХреЗ рд╕рдорд╛рдзрд╛рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкреВрдЫрдирд╛ рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реВрдВред рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рджреЛ рдЗрдВрдЯрд░рдлреЗрд╕ рд╣реИрдВ рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рдХреЗ рд▓рд┐рдП рдПрдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдиред рдЗрди рдЗрдВрдЯрд░рдлреЗрд╕ рдФрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдХреБрдЫ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╕рдордп рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╣рд╛рдВ, рдбрд┐рдЬрд╛рдЗрди рдХреА рд╕рдорд╕реНрдпрд╛ рдФрд░ рдмреЛрд▓реНрдб рдЗрдВрдЯрд░рдлреЗрд╕ рдЦрд░рд╛рдм рд╣реИрдВ, рд▓реЗрдХрд┐рди рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рдЗрди рдЗрдВрдЯрд░рдлреЗрд╕ рдореЗрдВ рдПрдХ рджрд░реНрдЬрди рд╕реЗ рдЕрдзрд┐рдХ рддрд░реАрдХреЗ рд╣реИрдВ, рдФрд░ рддрджрдиреБрд╕рд╛рд░, рдЙрдирдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдпрд╣ рд╕рдм рдорд╣рд╕реВрд╕ рд╣реЛрдЧрд╛ред рдФрд░ рдЕрдм рдЗрди рджреЛрдиреЛрдВ рд╕рдВрд╕реНрдерд╛рдУрдВ рдХреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЗ рд╕рд╛рде рдПрдХ рдШрдЯрдХ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рдЕрдиреНрдп рддреАрд╕рд░реЗ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╕рд╛рдеред рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдПрдХрд╛рдзрд┐рдХ рд╡рдВрд╢рд╛рдиреБрдХреНрд░рдо рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдХреЗ рд╕рд╛рде, рд╕рдм рдХреБрдЫ рдмрд╕ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ: рдПрдХ рд╡рд░реНрдЧ рдирдП рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдФрд░ рджреЛ рдореМрдЬреВрджрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕реЗ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ, рдФрд░ рдирдП рддреАрд╕рд░реЗ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рдХреЗрд╡рд▓ рддрд░реАрдХреЗ рд▓рд╛рдЧреВ рд╣реЛрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рдХреЗрд╡рд▓ рдХрдИ рдЙрддреНрддрд░рд╛рдзрд┐рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдХреЗ рд╕рд╛рде, рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рд╕рд░рд▓ рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рд╣реЛрдЧрд╛ред
рдпрд╣рд╛рдВ, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдЖрдк рд╕рд┐рд╕реНрдЯрдо рдХреЗ рдбрд┐рдЬрд╛рдЗрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХрд╛рдлреА рдЪрд░реНрдЪрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЕрднреНрдпрд╛рд╕ рд╕реИрджреНрдзрд╛рдВрддрд┐рдХ рдХреЛрдб рдбрд┐рдЬрд╛рдЗрди рдХреЗ рд░реВрдк рдореЗрдВ рдЖрджрд░реНрд╢рд╡рд╛рджреА рдирд╣реАрдВ рд╣реИред
рдПрдХ рдмрд╛рд░ рдПрдХ рд╕рд╛рдХреНрд╖рд╛рддреНрдХрд╛рд░ рдореЗрдВ рдореИрдВрдиреЗ рдПрдХ рдЙрдореНрдореАрджрд╡рд╛рд░ (рдПрдХ рдпреБрд╡рд╛ рд╕реЗ рджреВрд░) рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкреВрдЫрд╛ рдХрд┐ рд╡рд╣ рдХрдИ рд╡рд┐рд░рд╛рд╕рдд рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛ рдЬрд╛рдирддрд╛ рд╣реИред рдЬрд╡рд╛рдм рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рдерд╛: тАЬрд╣рд╛рдБ, рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рд╡рд╣рд╛рдБ рдХрдИ рд╡рд┐рд░рд╛рд╕рдд рд╣реИ рдФрд░, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ, рд╡рд╣рд╛рдБ рдЖрднрд╛рд╕реА рдХрдИ рд╡рд┐рд░рд╛рд╕рдд рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдмреБрд░рд╛ рд╣реИред рдореИрдВ рдЗрд╕рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрднреА рдирд╣реАрдВ рдХрд░рддрд╛ред рдФрд░ рдореИрдВ рдЙрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдФрд░ рдХреБрдЫ рдирд╣реАрдВ рдХрд╣ рд╕рдХрддрд╛
рдпрджрд┐ рдЖрдк рдирдИ рдЗрдХрд╛рдЗрдпрд╛рдВ рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЙрдиреНрд╣реЗрдВ рддреИрдпрд╛рд░ рд╕рдВрд╕реНрдерд╛рдУрдВ рдХреЗ рдХреНрдпреВрдмреНрд╕ рд╕реЗ рдЗрдХрдЯреНрдард╛ рдХрд░рдирд╛ рд╣реИ, рддреЛ рдХрдИ рдЙрддреНрддрд░рд╛рдзрд┐рдХрд╛рд░ рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рддрдВрддреНрд░реЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИред рдФрд░ рдШрдЯрдХ рдореЙрдбрд▓ рдХреЗрд╡рд▓ рдкрд╣рд▓реЗ рд╕реЗ рдореМрдЬреВрдж рдХреБрдЫ рд╕реЗ рдЯреБрдХрдбрд╝реЛрдВ рд╕реЗ рдХреБрдЫ рдирдпрд╛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рд╣реЛрддреЗ рд╣реИрдВред
рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди
рдХреЛрд░
рдЬреИрд╕рд╛ рдХрд┐ рдкрд╣рд▓реЗ рд╣реА рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд╕рдм рдХреБрдЫ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рдЖрд╕рдкрд╛рд╕ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ - рд╡рд┐рд╢реБрджреНрдз рд░реВрдк рд╕реЗ рдЖрднрд╛рд╕реА рддрд░реАрдХреЛрдВ рдФрд░ рдХреБрдЫ рдЕрд╢реБрджреНрдзрддрд╛ (рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛) рдХреЗ рд╕рд╛рде рд╕реА ++ рд╕рдВрд░рдЪрдирд╛рдПрдВред
рдореВрд▓ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдЬрд┐рд╕рдореЗрдВ рд╕реЗ рдЗрд╕ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рдореМрдЬреВрдж рд╕рднреА рдХреЛ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рдирд╛ рдЪрд╛рд╣рд┐рдП:
namespace Boss { struct IBase { BOSS_DECLARE_IFACEID("Boss.IBase") virtual ~IBase() {} BOSS_DECLARE_IBASE_METHODS() }; }
рд╣рдореНрдо, рдПрдХ рдЖрднрд╛рд╕реА рд╡рд┐рдзреНрд╡рдВрд╕рдХ рдФрд░ рдореИрдХреНрд░реЛрдЬрд╝ рдХреЗ рдПрдХ рдЬреЛрдбрд╝реЗ ... рдХрдИ рд▓реЛрдЧ рдХрд╣реЗрдВрдЧреЗ: "рдореИрдХреНрд░реЛрдЬрд╝ рдмреБрд░реЗ рд╣реИрдВ!" рд╣рд╛рдБ, рдпрд╣ рддрдм рдмреБрд░рд╛ рд╣реЛрддрд╛ рд╣реИ рдЬрдм рд╡реЗ рдкреНрд░рдЪреБрд░ рдорд╛рддреНрд░рд╛ рдореЗрдВ рд╣реЛрддреЗ рд╣реИрдВ рдФрд░ рдХрд╣реАрдВ рднреА рд▓рд╛рдЧреВ рд╣реЛрддреЗ рд╣реИрдВред рдХрдо рдорд╛рддреНрд░рд╛ рдореЗрдВ рдФрд░ рдХреЗрд╡рд▓ рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рддреЛ рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдлрд╛рд░реНрдорд╛рдХреЛрд▓реЙрдЬреА рдореЗрдВ рдЬрд╣рд░ - рдЦреБрд░рд╛рдХ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдорд╛рд░рддрд╛ рд╣реИ рдФрд░ рдЗрд▓рд╛рдЬ рдХрд░рддрд╛ рд╣реИред
BOSS_DECLARE_IFACEID #define BOSS_DECLARE_IFACEID(ifaceid_) \ static constexpr Boss::InterfaceId const GetInterfaceId() \ { \ return Boss::Crc32(ifaceid_); \ }
рдХреБрдЫ рд╕реНрдерд┐рд░ рд╡рд┐рдзрд┐ рдЬреЛрдбрд╝рддрд╛ рд╣реИ рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рдЖрдк рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЪреВрдВрдХрд┐ рд╕реНрдереИрддрд┐рдХ рд╡рд┐рдзрд┐ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдирд╣реАрдВ рдХрд░реЗрдЧреА, рдЗрд╕рд▓рд┐рдП, рдЖрдк рд╡рд┐рднрд┐рдиреНрди рдХрдВрдкрд╛рдЗрд▓рд░реЛрдВ рдкрд░ рднреА рдЗрдХрдЯреНрдард╛ рдХрд┐рдП рдЧрдП рдореЙрдбреНрдпреВрд▓ рдХреЗ рдмреАрдЪ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдХреЙрдиреНрд╕реНрдЯреЗрдХреНрд╕ рдЖрдкрдХреЛ рдЯреЗрдореНрдкрд▓реЗрдЯреНрд╕ рдХреЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд▓рд┐рдП рдкрд░рд┐рдгрд╛рдореА рдореВрд▓реНрдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ред
рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ, рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЛ рдПрдХ рдореИрдХреНрд░реЛ рдкреИрд░рд╛рдореАрдЯрд░ рджреНрд╡рд╛рд░рд╛ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдХрд┐рд╕реА рддрд░рд╣, рдХреЛрдб рд╕реВрдЦреА рд╕рдВрдЦреНрдпрд╛ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдХреЛрдб рдореЗрдВ рдЕрдзрд┐рдХ рд╕реБрдЦрдж рд▓рдЧрддреЗ рд╣реИрдВ, рдФрд░ рдЖрдкрдХреЛ рдХреБрдЫ рдбреЗрдЯрд╛ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдЬрд┐рд╕рд╕реЗ рдПрдХ рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдЙрддреНрдкрдиреНрди рд╣реЛрддрд╛ рд╣реИред рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╕реЗ crc32 рд╣реИред рдФрд░ рдпрд╣рд╛рдВ рдпрд╣ рдирдП рдорд╛рдирдХ рдХреА рддрд╛рдХрдд рд╣реИ: рд╕рдВрдХрд▓рди рдХреЗ рд╕рдордп рд▓рд╛рдЗрдиреЛрдВ рд╕реЗ crc32 рдФрд░ рдЕрдиреНрдп рдЪреАрдЬреЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ! рдЗрд╕ рддрд░рд╣ рдХреА рдПрдХ рдЪрд╛рд▓, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдХрд╛рд░реНрдпрдХреНрд░рдо рдореЗрдВ рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рдмрдирд╛рдИ рдЧрдИ рд▓рд╛рдЗрдиреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧреА, рдФрд░ рдпрд╣ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рдирд╣реАрдВ рд╣реЛрдЧреАред
Crc32 рдЧрдгрдирд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдХреБрдЫ рдбреЗрдЯрд╛ рддрд╛рд▓рд┐рдХрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдЬреЛ рдЖрд╕рд╛рдиреА рд╕реЗ рдЗрдВрдЯрд░рдиреЗрдЯ рдкрд░ рдкрд╛рдИ рдЬрд╛ рд╕рдХрддреА рд╣реИред рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, crc32 рдХреЛ рд▓рдЧрднрдЧ рдЗрд╕ рддрд░рд╣ рдкрдврд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
namespace Boss { namespace Private { template <typename T> struct Crc32TableWrap { static constexpr uint32_t const Table[256] = { 0x00000000L, 0x77073096L, 0xee0e612cL, 0x990951baL, 0x076dc419L, 0x706af48fL, 0xe963a535L, 0x9e6495a3L, 0x0edb8832L, 0x79dcb8a4L, ... etc }; }; typedef Crc32TableWrap<EmptyType> Crc32Table; template<int const I> inline constexpr std::uint32_t Crc32Impl(char const *str) { return (Crc32Impl < I - 1>(str) >> 8) ^ Crc32Table::Table[(Crc32Impl< I - 1>(str) ^ str[I]) & 0x000000FF]; } template<> inline constexpr std::uint32_t Crc32Impl<-1>(char const *) { return 0xFFFFFFFF; } } template <std::size_t N> inline constexpr unsigned Crc32(char const (&str)[N]) { return (Private::Crc32Impl<sizeof(str) - 2>(str) ^ 0xFFFFFFFF); } }
рддрд╛рд▓рд┐рдХрд╛ рдПрдХ рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рдХреНрдпреЛрдВ рд▓рд┐рдкрдЯреА рд╣реИ, рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдПрдХ рдЯреЗрдореНрдкрд▓реЗрдЯ рдореЗрдВ рднреА рдХреНрдпреЛрдВ? рдбреЗрдЯрд╛ рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЗ рд╕рд╛рде рдПрдХ cpp рдлрд╝рд╛рдЗрд▓ рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЕрд░реНрдерд╛рддреНред рд╕рдм рдХреБрдЫ рдХреЗрд╡рд▓ рд╢рд╛рдорд┐рд▓ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╣реИ рдФрд░ рд╢рд╛рдорд┐рд▓ рдлрд╝рд╛рдЗрд▓реЛрдВ рдореЗрдВ рд╕реНрдерд┐рд░ рдбреЗрдЯрд╛ рдХреЗ рдЖрдХрд░реНрд╖рдг рдХреЗ рдмрд┐рдирд╛ред
Crc32 рдХреА рдЧрдгрдирд╛, рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдЙрддреНрдкрдиреНрдиред рдЕрдм рдЗрд╕ рдмрд╛рдд рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рджреВрд╕рд░рд╛ рдореИрдХреНрд░реЛ рдХреЗ рдиреАрдЪреЗ рдХреНрдпрд╛ рд╣реИ:
BOSS_DECLARE_IBASE_METHODS #define BOSS_DECLARE_IBASE_METHODS() \ virtual Boss::UInt BOSS_CALL AddRef() = 0; \ virtual Boss::UInt BOSS_CALL Release() = 0; \ virtual Boss::RetCode BOSS_CALL QueryInterface(Boss::InterfaceId ifaceId, Boss::Ptr *iface) = 0;
рд╣рд╛рд▓рд╛рдВрдХрд┐! рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рддреАрди рддрд░реАрдХреЛрдВ рдХреЛ рд▓реЗрдирд╛ рдФрд░ рд░рдЦрдирд╛ рдЕрд╕рдВрднрд╡ рдерд╛? рдореИрдХреНрд░реЛ рдХреНрдпреЛрдВ? рдФрд░ рднрд╛рд░рдд рдореЗрдВ рд░рд┐рд╢реНрддреЗрджрд╛рд░реЛрдВ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдХреЗ рдореБрджреНрджреЗ рдХреЛ рдЦрддреНрдо рдХрд░реЗрдВ ... рд▓реЗрдХрд┐рди рдЪреВрдВрдХрд┐ рдХрдИ рдЙрддреНрддрд░рд╛рдзрд┐рдХрд╛рд░ рдХреА рдЕрд╕реНрд╡реАрдХреГрддрд┐ рдирд╣реАрдВ рд╣реИ рдФрд░ рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЗрд╕ рдореЙрдбрд▓ рдореЗрдВ рдмрд╣реБрдд рд╕реНрд╡рд╛рдЧрдд рд╣реИ, рддрд╛рдХрд┐ рд╕рдВрдХрд▓рдХ рдХреА рдЪрд┐рдВрддрд╛рдУрдВ рдХреЛ рд╢рд╛рдВрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗ рдХрд┐ рдЙрд╕реЗ рд╕рдордЭ рдореЗрдВ рдирд╣реАрдВ рдЖрддрд╛ рдХрд┐ рд╡рд┐рд░рд╛рд╕рдд рдХреА рдХреМрди рд╕реА рд╢рд╛рдЦрд╛ рд▓реЗрдиреА рд╣реИред рдореИрдХреНрд░реЛ рдХреЗ рддрд╣рдд рд╡рд░реНрдгрд┐рдд рд╡рд┐рдзрд┐рдпреЛрдВ рдореЗрдВ, рдЗрд╕ рдореИрдХреНрд░реЛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрдИ рдФрд░ рд╕реНрдерд╛рдиреЛрдВ рдкрд░ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рд░реЗрдлрд░реЗрдВрд╕ рдХрд╛рдЙрдВрдЯрд┐рдВрдЧ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдСрдмреНрдЬреЗрдХреНрдЯ рд▓рд╛рдЗрдлрдЯрд╛рдЗрдо рдореИрдиреЗрдЬрдореЗрдВрдЯ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред IBase рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдореЗрдВ рд╕рдВрджрд░реНрдн рдХрд╛рдЙрдВрдЯрд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдФрд░ рдХрд┐рд╕реА рдСрдмреНрдЬреЗрдХреНрдЯ рд╕реЗ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд▓рд┐рдП рдЕрдиреБрд░реЛрдз рдХрд░рдиреЗ рдХреА рд╡рд┐рдзрд┐ рд╢рд╛рдорд┐рд▓ рд╣реИред
рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкрд░рд┐рднрд╛рд╖рд╛ рдЙрджрд╛рд╣рд░рдг:
struct IFace : Boss::Inherit<Boss::IBase> { BOSS_DECLARE_IFACEID("IFace") virtual void BOSS_CALL Mtd() = 0; };
рд▓рдЧрднрдЧ рд╕рдм рдХреБрдЫ рд╕реНрдкрд╖реНрдЯ рд╣реИ: рдЗрдВрдЯрд░рдлрд╝реЗрд╕, рдЗрд╕рдХреЗ рддрд░реАрдХреЛрдВ рдХреА рдШреЛрд╖рдгрд╛, рдПрдХ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ред рд▓реЗрдХрд┐рди рд╕рд┐рд░реНрдл рдЗрдмреНрд╕реЗ рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдХреНрдпреЛрдВ рдирд╣реАрдВ?
рджреВрд╕рд░рд╛ рдЙрджрд╛рд╣рд░рдг рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╣реИ, рддрд╛рдХрд┐ рдЖрдЧреЗ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рд╕реНрдкрд╖реНрдЯ рд╣реЛ:
struct IFace1 : Boss::Inherit<Boss::IBase> { BOSS_DECLARE_IFACEID("IFace1") virtual void BOSS_CALL Mtd1() = 0; }; struct IFace2 : Boss::Inherit<Boss::IBase> { BOSS_DECLARE_IFACEID("IFace2") virtual void BOSS_CALL Mtd2() = 0; }; struct IFace3 : Boss::Inherit<IFace1, IFace2> { BOSS_DECLARE_IFACEID("IFace3") virtual void BOSS_CALL Mtd3() = 0; };
рдЕрдм рд╕рдм рдХреБрдЫ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ? рдирд╣реАрдВ? рдпрд╣ рд╕рд░рд▓ рд╣реИ: рдПрдХрд╛рдзрд┐рдХ рд╡рдВрд╢рд╛рдиреБрдХреНрд░рдо рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдХреЗрд╡рд▓ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЛ рдХрд┐рд╕реА рддрд░рд╣ рд╕реЗ рдХреНрд╡реИрд░реАрдЗрдВрдЯрд░рдлреЗрд╕ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╕рдордп рд╕рд╣реА рдХреА рддрд▓рд╛рд╢ рдореЗрдВ рдЙрдиреНрд╣реЗрдВ "рдмрд╛рдпрдкрд╛рд╕" рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдорд╛рдорд▓рд╛ рдереЛрдбрд╝рд╛ рдЧреВрдврд╝ рд╣реИ, рд▓реЗрдХрд┐рди рдХрднреА-рдХрднреА рдореИрдВ рдЗрд╕ рдкрд░ рдЖ рдЧрдпрд╛ред рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ IFace3 рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдВрдХреЗрддрдХ рд╣реИ, рддреЛ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдЖрдк рдЗрд╕рдХреЗ рдЖрдзрд╛рд░ рд╡рд░реНрдЧреЛрдВ рдХреЗ рд╕рднреА рддрд░реАрдХреЛрдВ рдХреЛ рдпрд╣рд╛рдВ рдЬрдЧрд╣ рджреЗ рд╕рдХрддреЗ рд╣реИрдВред рдФрд░ рдпрджрд┐ рдЖрдк рдЗрд╕реЗ рдХрд┐рд╕реА рдЕрдиреНрдп рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЕрдзрд┐рдХ рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд, рдЬреЛ рд╣рдореЗрд╢рд╛ рдХреБрдЫ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╕реЗ IFace1 рдпрд╛ IFace2 рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░рддрд╛ рд╣реИ, рдЬрд░реВрд░реА рдирд╣реАрдВ рдХрд┐ рдЗрд╕ рддрд░рд╣ рдХреА рд╡рд┐рд░рд╛рд╕рдд рд╕рдВрд░рдЪрдирд╛ рдХреЗ рд╕рд╛рде рд╣реЛ, рддреЛ рдпрд╣ рдЕрдм C ++ рддрдВрддреНрд░ рдкрд░ рдирд┐рд░реНрднрд░ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд QueryInterface рдкрд░, рдЬрд┐рд╕рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдХрд┐рд╕реА рддрд░рд╣ рдЗрд╕ рдкрджрд╛рдиреБрдХреНрд░рдо рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЗрдзрд░ рдЙрдзрд░ рд╣реЛ рдЬрд╛рдирд╛ред рдпрд╣ рд╡рд╣ рдЬрдЧрд╣ рд╣реИ рдЬрд╣рд╛рдВ рдХреБрдЫ рдЕрд╢реБрджреНрдзрддрд╛ рдХрд╛рдо рдореЗрдВ рдЖрддреА рд╣реИ: рдмреЙрд╕ :: рдЗрдирд╣реЗрд░рд┐рдЯ, рдЬрд┐рд╕рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИрдВ:
namespace Boss { template <typename ... T> struct Inherit : public T ... { virtual ~Inherit() {} typedef std::tuple<T ... > BaseInterfaces; BOSS_DECLARE_IBASE_METHODS() }; }
рдпрд╣ рдЕрд╢реБрджреНрдзрддрд╛ рдХреЗрд╡рд▓ рдореВрд▓ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреА рд╣рд╕реНрддрд╛рдВрддрд░рд┐рдд рд╕реВрдЪреА рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓реА рд╣реИ, "рд╕рдВрдХрд▓рдХ" рд╡рд╛рдВрдЫрд┐рдд рд╡рд┐рдзрд┐ рдХреА рдкрд╕рдВрдж рдХреА рдЕрд╡реИрдзрддрд╛ рдХреЗ рдкрд╛рдардХ рдХреЛ рдЖрд╢реНрд╡рд╕реНрдд рдХрд░рддрд╛ рд╣реИ (BOSS_DECLARE_IBASE_METHODS рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдФрд░ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреА "рд╕реВрдЪреА" рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ)ред рдпрд╣рд╛рдВ рдирдпрд╛ рдорд╛рдирдХ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рдПрдХ рдЪрд░ рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд╕рд╛рде рдЯреЗрдореНрдкрд▓реЗрдЯреНрд╕ рдХреЗ рд░реВрдк рдореЗрдВ рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рд▓рд╛рдн рджреЗрддрд╛ рд╣реИред рд╣реБрд░реНрд░реЗ, рд░реБрдХреЛ! рдкрд╣рд▓реЗ, рдпрд╣ рдЕрд▓реЗрдХреНрдЬреЗрдВрдбреНрд░реЗрд╕реНрдХреБ рд╢реИрд▓реА рдореЗрдВ рднрд╛рд░реА рдкреНрд░рдХрд╛рд░ рдХреА рд╕реВрдЪрд┐рдпреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдЦреИрд░, рдпрд╣рд╛рдВ рднреА рдирдП "рдкреНрд▓рд╕рд╕" рдиреЗ рдЕрднреА рднреА рдПрдХ рдЯрдкрд▓ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рдмреЛрдирд╕ рджрд┐рдпрд╛, рдЬрд┐рд╕рд╕реЗ рдЖрдкрдХреА рд╕рдорд╛рди рдмрд╛рдЗрдХ рд▓рд┐рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╕рдорд╛рдкреНрдд рд╣реЛ рдЧрдИред
рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЛ рдХреИрд╕реЗ рдФрд░ рдХреНрдпреЛрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдП, рдЗрд╕ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЙрдиреНрд╣реЗрдВ рдХрд╣реАрдВ рдФрд░ рдХрд┐рд╕реА рддрд░рд╣ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдПрдХ рдЫреЛрдЯрд╛ рд╕рд╛ рдЙрджрд╛рд╣рд░рдг:
struct IFace1 : Boss::Inherit<Boss::IBase> { BOSS_DECLARE_IFACEID("IFace1") virtual void Mtd1() = 0; }; class Face_1 : public Boss::CoClass<Boss::Crc32("Face_1"), IFace1> { public: virtual void Mtd1() {
рдФрд░ рдПрдХ рдмреЗрд╣рддрд░реАрди рдЙрджрд╛рд╣рд░рдг struct IFace1 : Boss::Inherit<Boss::IBase> { BOSS_DECLARE_IFACEID("IFace1") virtual void Mtd1() = 0; }; struct IFace2 : Boss::Inherit<Boss::IBase> { BOSS_DECLARE_IFACEID("IFace2") virtual void Mtd2() = 0; }; struct IFace3 : Boss::Inherit<Boss::IBase> { BOSS_DECLARE_IFACEID("IFace3") virtual void Mtd3() = 0; }; class Face1 : public Boss::CoClass<Boss::Crc32("Face1"), IFace1> { public: virtual void Mtd1() {
рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рд╕рднреА "рдЦрд▓рдирд╛рдпрдХреЛрдВ" рдХреЗ рд╕рд╛рде, рдЬрд┐рд╕реЗ рдЙрд╕реЗ рдмрд╛рд╣рд░ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдЖрдк рдЕрдзрд┐рдХ рдЕрд░рд╛рдЬрдХрддрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рджрд┐рдпрд╛ рдЧрдпрд╛ рдЙрджрд╛рд╣рд░рдг "рдХреНрдпреВрдмреНрд╕" рдХреЗ рдирд┐рд░реНрдорд╛рдг рдореЗрдВ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рд╕рдВрднрд╛рд╡рдирд╛рдУрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИред
рдпрд╣ рдзреНрдпрд╛рди рд░рдЦрдирд╛ рдореБрд╢реНрдХрд┐рд▓ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди CoClass рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛ рд╣реИред CoClass рдХрд╛ рдПрдХ рдмрд╣реБрдд рд╣реА рд╕рд░рд▓ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИ:
namespace Boss { template <ClassId ClsId, typename ... T> class CoClass : public virtual Private::CoClassAdditive , public T ... { public: typedef std::tuple<T ... > BaseEntities; CoClass() : Constructed(false) { }
рдЗрдирд╣реЗрд░рд┐рдЯ рд╕рдВрд░рдЪрдирд╛ рдХреА рддрд░рд╣ рдпрд╣ рд╡рд░реНрдЧ, рд╣рд╕реНрддрд╛рдВрддрд░рд┐рдд рд╕рдВрд╕реНрдерд╛рдУрдВ рдХреА рд╕реВрдЪреА рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛ рд╣реИ, рдЗрд╕ рд╡рдВрд╢рд╛рдиреБрдХреНрд░рдо рд╕реВрдЪреА рдХреЛ "рдмреВрдБрджреЗрдВ", рдХреБрдЫ рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛
рдЕрд╢реБрджреНрдзрд┐рдпрд╛рдБ (рдирд┐рдЬреА :: CoClassAdditive) / рдмреНрд░рд╛рдВрдб namespace Boss { namespace Private { struct CoClassAdditive { virtual ~CoClassAdditive() {} }; } }
(рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕рдВрд╕реНрдерд╛рдУрдВ рдХреЛ рд╡рд░реНрдЧреАрдХреГрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛: рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдпрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди), рдХрдВрдкрд╛рдЗрд▓рд░ рднреА рдЧреИрд░рдХрд╛рдиреВрдиреАрддрд╛ рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ (BOSS_DECLARE_IBASE_METHODS рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рддрд░реАрдХреЛрдВ рдХреЛ рдзрдХреНрдХрд╛ рджреЗрдХрд░) рдФрд░ рдирд┐рд░реНрдорд╛рдг рдХреА рдЬрд╛ рд░рд╣реА рд╡рд╕реНрддреБ рдХрд╛ рдПрдХ рдЪрд┐рдиреНрд╣ рд╣реЛрддрд╛ рд╣реИ (рдмрд╛рдзрд┐рдд)ред
рд╡рд╣рд╛рдБ рдЗрдВрдЯрд░рдлреЗрд╕ рд╣реИрдВ, рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЕрднреА рддрдХ IBase рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдирд╣реАрдВ рд╣реБрдЖ рд╣реИред рдЗрд╕ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕рдВрднрд╡рддрдГ рд╕рдмрд╕реЗ рдХрдард┐рди рдореЗрдВ рд╕реЗ рдПрдХ рд╣реЛрдЧрд╛ред
рдЙрдкрд░реЛрдХреНрдд рдмрдбрд╝реЗ рдЙрджрд╛рд╣рд░рдг рд╕реЗ рдПрдХ рд╡рд╕реНрддреБ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛:
auto Obj = Boss::Base<Face123456>::Create();
рдмреЙрд╕ :: рдмреЗрд╕ рдмреЙрд╕ рдХрд╛ рдПрдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╡рд░реНрдЧ рд╣реИ :: IBaseред рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ, рдХреБрдЫ рд╕рдВрдЪрд╛рд▓рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд░реНрдЧ рдкрджрд╛рдиреБрдХреНрд░рдо рдХреЛ рдмрд╛рдпрдкрд╛рд╕ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред рддреЛ рдКрдкрд░ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рд╕рд░рд▓реАрдХреГрдд рдкрджрд╛рдиреБрдХреНрд░рдо рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛:
рд╕рд╣реА рдХреА рддрд▓рд╛рд╢ рдореЗрдВ рдХрдХреНрд╖рд╛ рдкрджрд╛рдиреБрдХреНрд░рдо рдХреЛ рджрд░рдХрд┐рдирд╛рд░ рдХрд░ рдореИрдВ рдереЛрдбрд╝реА рджреЗрд░ рдХреЗ рд▓рд┐рдП рд╕реНрдердЧрд┐рдд рдХрд░ рджреВрдВрдЧрд╛ред рдЬрд▓реНрджреА рд╕реЗ рд╕рд░рд▓ рддрд░реАрдХреЛрдВ рд╕реЗ рдЪрд▓реЗрдВред
AddRef (рд░реЗрдлрд░реЗрдВрд╕ рдХрд╛рдЙрдВрдЯ рдмрдврд╝рд╛рддрд╛ рд╣реИ) рдФрд░ рд░рд┐рд▓реАрдЬрд╝ рдХреЛ рд░рд┐рдлрд╝рд░ рдХрд░рдиреЗ рд╕реЗ рд░реЗрдлрд░реЗрдВрд╕ рдХрд╛рдЙрдВрдЯрд┐рдВрдЧ рдХреА рдЬрд╛рддреА рд╣реИ рдФрд░ рд░реЗрдлрд░реЗрдВрд╕ рдХрд╛рдЙрдВрдЯ рдХрдо рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЬрдм рдЬреАрд░реЛ рдкрд╣реБрдБрдЪ рдЬрд╛рддрд╛ рд╣реИ рддреЛ рдСрдмреНрдЬреЗрдХреНрдЯ рдбрд┐рд▓реАрдЯ рдХрд░ рджреЗрддрд╛ рд╣реИ, рдЗрд╕реЗ рдбрд┐рд▓реАрдЯ рдХрд░ рд░рд╣рд╛ рд╣реИ)ред рдЪреВрдВрдХрд┐ рдпрд╣ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рд╡рд╕реНрддреБрдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдмрд╣реБ-рдереНрд░реЗрдбреЗрдб рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдХрд╛рдЙрдВрдЯрд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо std :: atomic рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдмрд╣реБ-рдереНрд░реЗрдбреЗрдб рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ рдкрд░рдорд╛рдгреБ рдХреЛ рдмрдврд╝рд╛рдиреЗ рдФрд░ рдХрдо рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рд╣рд╛рдВ, рдЕрдВрдд рдореЗрдВ рд╕реА ++ рдиреЗ рдереНрд░реЗрдбреНрд╕ рдХреЗ рдЕрд╕реНрддрд┐рддреНрд╡ рдХреЛ рдорд╛рдиреНрдпрддрд╛ рджреА рдФрд░ рдереНрд░реЗрдбреНрд╕ рдФрд░ рд╕рд┐рдВрдХреНрд░реЛрдирд╛рдЗрдЬрд╝реЗрд╢рди рдкреНрд░рд╛рдЗрдореЗрдЯрд┐рд╡реНрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдерд╛ред
рдмрдирд╛рдПрдБ рд╡рд┐рдзрд┐ рдореЗрдВ рдпрд╣ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИ:
template <typename ... Args> static RefObjPtr<T> Create(Args const & ... args) { Private::ModuleCounter::ScopedLock Lock; RefObjPtr<T> NewInst(new Base<T>(args ...)); Private::FinalizeConstruct<T>::Construct(NewInst.Get()); return std::move(NewInst); }
рдорд╛рдкрджрдВрдбреЛрдВ рдХреА рдПрдХ рдЪрд░ рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд╕рд╛рде рдЯреЗрдореНрдкрд▓реЗрдЯреНрд╕ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдЖрдкрдХреЛ рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рдзрд┐ рдмрдирд╛рдиреЗ рдФрд░ рдирд┐рд░реНрдорд╛рдг рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИред рдкрд╣рд▓реЗ, рдпрд╣ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рдерд╛, рдФрд░ рдпрджрд┐ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдХреБрдЫ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рддреЛ рдЖрдкрдХреЛ рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдирд╛ рд╣реЛрдЧрд╛ рдЬрд┐рд╕рдореЗрдВ рдХреБрдЫ рдкреНрд░рдХрд╛рд░ рдХреА (рдЗрд╕рдХреА рдЕрдкрдиреА рд╡рд┐рд╢рд┐рд╖реНрдЯ) рдЯрд╛рдЗрдк Init рдереА, рдЬрд┐рд╕рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рдкрд╛рд░рд┐рдд рд╣реЛ рдЧрдпрд╛ рдерд╛ред
ModuleCounter namespace Boss { namespace Private { struct ModuleRefCounterTypeStub { }; template <typename T> class ModuleRefCounter { public: static void AddRef() { Counter.fetch_add(1, std::memory_order_relaxed); } static void Release() { Counter.fetch_sub(1, std::memory_order_relaxed); } static UInt GetCounter() { return Counter; } private: static std::atomic<UInt> Counter; public: class ScopedLock { public: ScopedLock(ScopedLock const &) = delete; ScopedLock(ScopedLock &&) = delete; ScopedLock operator = (ScopedLock const &) = delete; ScopedLock operator = (ScopedLock &&) = delete; ScopedLock() { ModuleRefCounter<T>::AddRef(); } ~ScopedLock() { ModuleRefCounter<T>::Release(); } }; }; template <typename T> std::atomic<UInt> ModuleRefCounter<T>::Counter(0); typedef ModuleRefCounter<ModuleRefCounterTypeStub> ModuleCounter; } }
рдореЙрдбреНрдпреВрд▓ рд╕рдВрджрд░реНрдн рдЧрдгрдирд╛ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рддрд╛ рд╣реИред рджреЛ рд╕рдВрджрд░реНрдн рдХрд╛рдЙрдВрдЯрд░ рд╣реИрдВ - рдпрд╣ рд╕реАрдзреЗ рдСрдмреНрдЬреЗрдХреНрдЯ рдкрд░ рд╕рдВрджрд░реНрдн рдХрд╛рдЙрдВрдЯрд░ рд╣реИ рдФрд░ рд╕рднреА рдореЙрдбреНрдпреВрд▓ рд▓рд┐рдВрдХ рдХрд╛ рдХрд╛рдЙрдВрдЯрд░ рд╣реИред рдореЙрдбреНрдпреВрд▓ рдХреЗ рд╕рдВрджрд░реНрдн рдХрд╛рдЙрдВрдЯрд░ рдХреЛ рд╕рдордЭрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдЬрдм рдореЙрдбреНрдпреВрд▓ рдореЗрдВ "рдЬреАрд╡рд┐рдд" рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реЛрддреЗ рд╣реИрдВ, рдФрд░ рдЬрдм рдПрдХ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдореЙрдбреНрдпреВрд▓ рдХреЛ рдЕрдирд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рд╕реНрдереИрддрд┐рдХ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЛ рддреНрдпрд╛рдЧрдиреЗ рдХреЗ рд▓рд┐рдП рдФрд░ рдореЙрдбреНрдпреВрд▓ рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХреЗ рд▓рд┐рдП "рд▓реЛрдирд░" рдкреИрдЯрд░реНрди (рдкреНрд░рддреНрдпреЗрдХ рдореЙрдбреНрдпреВрд▓ рдХреЗ рд▓рд┐рдП) рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЗрд╕реЗ рдХреЗрд╡рд▓ рд╕рдореНрдорд┐рд▓рд┐рдд рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдлрд┐рд░ рдЯреЗрдореНрдкрд▓реЗрдЯ рдФрд░ рд╕реНрдерд┐рд░ рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдЪрд╛рд▓ рдХрд╛рдлреА рдЙрдкрдпреЛрдЧреА рд╣реИред рдЖрдк рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦ рдореЗрдВ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕реЗ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ: рдпрджрд┐ рдЖрдк рдПрдХ рд╕реНрдерд┐рд░ рдХреНрд╖реЗрддреНрд░ рдХреЗ рд╕рд╛рде рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЯреЗрдореНрдкрд▓реЗрдЯ рдмрдирд╛рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рд╕реЗ рддреНрд╡рд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЗрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдкреВрд░реЗ рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рд╣реА рд╣реЛрдЧрд╛ред рдпрд╣ рдПрдХ рдЫреЛрдЯреА рд╕реА рдЪрд╛рд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдПрдХ cpp-file рдореЗрдВ рдХрд╣реАрдВ рднреА рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдП рдмрд┐рдирд╛ рд╕рдореНрдорд┐рд▓рд┐рдд рдлрд╝рд╛рдЗрд▓реЛрдВ рдореЗрдВ рдХреБрдВрд╡рд╛рд░рд╛ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдФрд░ рдЗрд╕ рд╕реБрдВрджрд░ рд╕рдорд╛рдзрд╛рди рдореЗрдВ рдПрдХ рд░реЗрдХ рд╣реИ, рдПрдХ рдмрдЪреНрдЪреЛрдВ рдХреА рд░реЗрдХ: рд╕рдВрднрд╛рд▓ рджреЛ рдЧреБрдирд╛ рдЫреЛрдЯреА рд╣реИ, рдпрд╣ рдЕрдзрд┐рдХ рд╕рдЯреАрдХ рдФрд░ рджрд░реНрджрдирд╛рдХ рддрд░реАрдХреЗ рд╕реЗ рдзрдбрд╝рдХрддрд╛ рд╣реИ ... рдпрд╣ рд╕рдорд╛рдзрд╛рди рдбреАрдбреА рдореЗрдВ рдареАрдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рдиред In рдореЗрдВ рдореИрдВрдиреЗ рдПрдХ рд╕рдорд╕реНрдпрд╛ рдкрдХрдбрд╝реА рд╣реИ: рдПрдХ рд╣реА рдкреНрд░рдХрд╛рд░ рд╕реЗ рддреБрд░рдВрдд рд╕реНрдерд┐рд░ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдЯреЗрдореНрдкрд▓реЗрдЯ рдПрдХ рдмрди рдЧрдпрд╛ред рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рднрд╛рдЧ рдХреЗ рд░реВрдк рдореЗрдВ рдЗрд╕ рдореЙрдбрд▓ рдХреЗ рдШрдЯрдХреЛрдВ рдХреЗ рд╕рд╛рде .so рдХреЗ рд▓рд┐рдП! рдореБрдЭреЗ рдмрд╛рдж рдореЗрдВ рдХреНрдпреЛрдВ рдПрд╣рд╕рд╛рд╕ рд╣реБрдЖ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдЧреБрдордирд╛рдо рдирд╛рдореЛрдВ рдФрд░ рдПрдХ рд╕рдореНрдорд┐рд▓рд┐рдд рдлрд╝рд╛рдЗрд▓ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдПрдХ рд╕рд░рд▓ рдХреЗ рдкрдХреНрд╖ рдореЗрдВ рд╕реБрдВрджрд░ рдирд┐рд░реНрдгрдп рдХреЛ рдЫреЛрдбрд╝рдирд╛ рдкрдбрд╝рд╛, рдЬреЛ рдкреНрд░рддреНрдпреЗрдХ рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рдмрд╛рд░ рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рд╣реИ (рдЬреЛ рдкрд░рд╡рд╛рд╣ рдХрд░рддрд╛ рд╣реИ - рдмреЙрд╕ / рд╢рд╛рдорд┐рд▓ / рдкреНрд▓рдЧрдЗрди / рдореЙрдбреНрдпреВрд▓ред рдПрдЪ)ред
C ++ рдХреЛ рдХрдИ рд▓реЛрдЧреЛрдВ рджреНрд╡рд╛рд░рд╛ рдПрдХ рдРрд╕реА рднрд╛рд╖рд╛ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ "рдкреИрд░ рдореЗрдВ рдЦреБрдж рдХреЛ рдЧреЛрд▓реА рдорд╛рд░рдирд╛" рдЖрд╕рд╛рди рдмрдирд╛рддрд╛ рд╣реИред рдФрд░, рдПрдХ рдирд┐рдпрдо рдХреЗ рд░реВрдк рдореЗрдВ, рдпрд╣ рдЕрдХреНрд╕рд░ рдЙрд╕рдХреЗ рдЦрд┐рд▓рд╛рдл рд╕рддрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЗ рдЖрд╡рдВрдЯрди / рд░рд┐рд▓реАрдЬ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╕рдВрдЪрд╛рд▓рди рдХреА рдЬреЛрдбрд╝реА рдХреЗ рдХрд╛рд░рдг, рдФрд░ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд╕реНрдореГрддрд┐ рдореЗрдВред рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдЖрдк рд╕реНрдорд╛рд░реНрдЯ рдкреЙрдЗрдВрдЯрд░реНрд╕ рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдПрдХ рд╕рд┐рд░рджрд░реНрдж рдХрдо рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред RefObjPtr рдХреЗрд╡рд▓ рдПрдХ рд╕реНрдорд╛рд░реНрдЯ рдкреЙрдЗрдВрдЯрд░ рд╣реИ рдЬреЛ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдЬреАрд╡рдирдХрд╛рд▓ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП AddRef рдФрд░ Release рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдореЗрдВ рдЬрдм рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ AddRef рдФрд░ рд░рд┐рд▓реАрдЬрд╝ рддрд░реАрдХреЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛрдб рдореЗрдВ рдирд╣реАрдВ рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдПред
рдирдП рдорд╛рдирдХ рдХрд╛ рдПрдХ рдРрд╕рд╛ рд╣рд┐рд╕реНрд╕рд╛ рдЬреЛ r- рдорд╛рди рдХреЗ рд░реВрдк рдореЗрдВ рдЖрдкрдХреЛ рдЕрдзрд┐рдХ рдЗрд╖реНрдЯрддрдо рд╕рдВрд╕реНрдерд╛рдУрдВ рдХреЛ рд▓рд┐рдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ; рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╕рднреА рдПрдХ рд╣реА RefObjPtr рдХреЙрдкреА рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░реНрд╕ рдкрд░ рдПрдХ рдмрд╛рд░ рдлрд┐рд░ AddRef / рд░рд┐рд▓реАрдЬрд╝ рдХреЛ рдХреЙрд▓ рдХрд┐рдП рдмрд┐рдирд╛ рдХрд┐рд╕реА рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП (рд░рд┐рдЯрд░реНрди std :: move (NewInst))ред
рдлрд╝рд╛рдЗрдирд▓ рдХреЙрд▓ рдЯреВ рдиреЛ рд╡рди рдлрд╝рд╛рдЗрдирд▓рд╛рдЗрдЬрд╝рдХреЙрдиреНрд╕реНрдЯреНрд░рдХреНрдЯ рднреА рд╣реИред рдпрд╣ рдХреНрдпрд╛ рд╣реИ рдФрд░ рдХреНрдпреЛрдВ рд╣реИ? рдорд╛рди рд▓реЗрдВ рдХрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ рдкрджрд╛рдиреБрдХреНрд░рдо рд╣реИ рдЬреЛ рдКрдкрд░ рдХреА рдЖрдХреГрддрд┐ рдореЗрдВ рджрд┐рдЦрд╛рдП рдЧрдП рд╕реЗ рд▓рдЧрднрдЧ рдХреЛрдИ рд╕рд░рд▓ рдирд╣реАрдВ рд╣реИ, рдФрд░ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рд╕реЗ рдПрдХ рдореЗрдВ рдЖрдкрдХреЛ рдХреБрдЫ рдХреЙрд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЬрд┐рд╕реЗ рдХрдХреНрд╖рд╛ рдореЗрдВ рдПрдХ рд╕реНрддрд░ рд╕реЗ рдХрдо рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЖрдк рд╡рд░реНрдЪреБрдЕрд▓ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди, рдЗрд╕реЗ рд╕реАрдзреЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ рдХрд╣реЗрдВ, рддреЛ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЗ рдкрд╛рд╕ рдЕрднреА рддрдХ рдПрдХ рд╡рд░реНрдЪреБрдЕрд▓ рдлрд╝рдВрдХреНрд╢рди рдЯреЗрдмрд▓ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╡рд┐рдзреНрд╡рдВрд╕рдХ рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИред рд╡рд░реНрдЪреБрдЕрд▓ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреЗ рд╕рднреА рдХреЙрд▓ рдХреНрд▓рд╛рд╕ рдХреЗ рд╕рд╛рдзрд╛рд░рдг рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреЗ рдХреЙрд▓реНрд╕ рдХреА рддрд░рд╣ рд╣реЛрдВрдЧреЗ рдФрд░ рдирд┐рдЪрд▓реЗ рд╕реНрддрд░ рдкрд░ рдУрд╡рд░рд░рд╛рдЗрдб рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рд╕реЗ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рд╕реЗ рдХрд╛рдо рдирд╣реАрдВ рдЪрд▓реЗрдЧрд╛ред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдлрд╝рд╛рдЗрдирд▓рдХреЙрдиреНрд╕реНрдЯреНрд░рдХреНрдЯ рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдСрдмреНрдЬреЗрдХреНрдЯ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдирд┐рд░реНрдорд┐рдд рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рдХрд╣рд╛ рдЬрд╛рдПрдЧрд╛ред рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рдХреБрдЫ рддрд░реНрдХ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рдХреЗрд╡рд▓ рдЕрдкрдиреЗ рджрдо рдкрд░, рдирд┐рд░реНрдорд╛рдгрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рддрд░реНрдХ рдХреЗ рд╕рдорд╛рди, рдЕрд░реНрдерд╛рддреНред рдкреВрд░реЗ рдкрджрд╛рдиреБрдХреНрд░рдо рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдЬрд╛рдПрдВ рдФрд░ рдлрд╝рд╛рдЗрдирд▓рд┐рдЬрд╝рдХреЙрдирд╕реНрдЯреНрд░рдХреНрдЯ рдХреЛ рдкреНрд░рддреНрдпреЗрдХ рд╡рд░реНрдЧ рдкрд░ рдЙрд╕ рдХреНрд░рдо рдореЗрдВ рдХреЙрд▓ рдХрд░реЗрдВ, рдЬрд┐рд╕рдореЗрдВ рдирд┐рд░реНрдорд╛рдгрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдПрдХ рд╡рд░реНрдЧ рдбреЗрд╡рд▓рдкрд░ рдХреЛ рдЕрдкрдиреА рдХрдХреНрд╖рд╛ рдореЗрдВ рдлрд╝рд╛рдЗрдирд▓реАрдХреЗрд╕реНрдЯреНрд░рдХреНрдЪрд░ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдЬрдм рд╡рд░реНрдЧ рдкрджрд╛рдиреБрдХреНрд░рдо рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рддрд╛ рд╣реИ, рддреЛ рдореЙрдбрд▓ рдореЗрдВ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдлрд╝рд╛рдЗрдирд▓рд╛рдЗрдЬрд╝рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯ рддрд░реНрдХ рдХрдХреНрд╖рд╛ рдореЗрдВ рдлрд╝рд╛рдЗрдирд▓рд┐рдЬрд╝рдХреЙрдиреНрд╕реНрдЯреНрд░рдХреНрдЯ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдХрд╛ рдирд┐рд░реНрдзрд╛рд░рдг рдХрд░реЗрдЧрд╛, рдЬреЛ рдЕрдЪреНрдЫреЗ рдкреБрд░рд╛рдиреЗ SFINAE рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдпрджрд┐ рдпрд╣ рд╡рд┐рдзрд┐ рдореМрдЬреВрдж рд╣реИ, рддреЛ рдЗрд╕реЗ рдХреЙрд▓ рдХрд░реЗрдЧрд╛ред рдореВрд▓ рдирд┐рдпрдо: рдЕрдВрддрд┐рдо рд░реВрдк рджреЗрдирд╛ рдХрд╕реНрдЯрдо рдХреЛрдб рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЖрднрд╛рд╕реА рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП! рдЕрдиреНрдпрдерд╛, рд╕рдорд╛рдкреНрдд рдХреНрдпреВрдмреНрд╕ рд╕реЗ рд╕рдВрд╕реНрдерд╛рдУрдВ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рддреЗ рд╕рдордп рдПрдХ рдЧрдбрд╝рдмрдбрд╝ рд╣реЛрдЧреАред
рдлрд╝рд╛рдЗрдирд▓реАрдХреЗрдиреНрд╕рдЯреНрд░реИрдХ рдХреНрд▓рд╛рд╕ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдЗрд╕ рдХреЛрдб рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХреА рдЬрд╛рддреА рд╣реИ:
template <typename T> class HasFinalizeConstruct { private: typedef char (&No)[1]; typedef char (&Yes)[10]; template <typename U, void (U::*)() = &U::FinalizeConstruct> struct CheckMtd { typedef Yes Type; }; template <typename U> static typename CheckMtd<U>::Type Check(U const *); static No Check(...); public: enum { Has = sizeof(Check(static_cast<T const *>(0))) == sizeof(Yes) }; };
рдЕрдВрддрд┐рдо рд░реВрдк рд╕реЗ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рднреА рддрд░реНрдХ namespace Boss { namespace Private { template <bool HasFinalizeConstruct> struct CallFinalizeConstruct { template <typename ObjType> static void Call(ObjType *obj) { obj->FinalizeConstruct(); SetConstructedFlag(obj, true); } }; template <> struct CallFinalizeConstruct<false> { template <typename ObjType> static void Call(ObjType *obj) { SetConstructedFlag(obj, true); } }; template < typename T, bool IsCoClass = std::is_base_of<CoClassAdditive, T>::value > struct FinalizeConstruct { template <typename ObjType> static void Construct(ObjType *) { } }; template <typename T, std::size_t I> struct FinalizeConstructIter { template <typename ObjType> static void Construct(ObjType *obj) { typedef typename std::tuple_element<I, T>::type CurType; FinalizeConstructIter<T, I - 1>::Construct(obj); FinalizeConstruct<CurType>::Construct(static_cast<CurType *>(obj)); } }; template <typename T> struct FinalizeConstructIter<T, -1> { template <typename ObjType> static void Construct(ObjType *) { } }; template <typename T> struct FinalizeConstruct<T, true> { template <typename ObjType> static void Construct(ObjType *obj) { typedef typename T::BaseEntities BaseEntities; enum { BaseEntityCount = std::tuple_size<BaseEntities>::value - 1 }; FinalizeConstructIter<BaseEntities, BaseEntityCount>::Construct(obj); CallFinalizeConstruct<HasFinalizeConstruct<T>::Has>::Call(obj); } }; } }
рдпрд╣ рдЯреЗрдореНрдкрд▓реЗрдЯреНрд╕ рдХреЗ рдирд┐рдЬреА рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдкрд░ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдЖрдзрд╛рд░ рд╡рд░реНрдЧреЛрдВ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде "рдЦреЛрджрд╛" рдЯреНрдпреВрдкрд▓реНрд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкрджрд╛рдиреБрдХреНрд░рдо рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЪрд▓рдирд╛ рд╣реИред рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдХрд░рдг рд╣реЛрдиреЗ рд▓рдЧреЗ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдХреНрдпрд╛ рдХреЛрдИ рд╡рд░реНрдЧ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╡рд░реНрдЧ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИ, рдЕрдм рдЖрдк рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рд▓рд┐рдЦрдиреЗ рдХреЗ рдмрдЬрд╛рдп std :: is_base_of рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЖрдк рдЕрд▓реЗрдХреНрдЬреЗрдВрдбреНрд░реЗрд╕реНрдХреБ рд╢реИрд▓реА рдореЗрдВ рдЯрд╛рдЗрдк рд╕реВрдЪрд┐рдпреЛрдВ рдХреЗ рдмрдЬрд╛рдп std :: tuple рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдбрд┐рдЬрд╛рдЗрдирд░реЛрдВ рдХреЗ рд▓рд┐рдП рд╕рд╛рджреГрд╢реНрдп рддреИрдпрд╛рд░ рд╣реИ, рд▓реЗрдХрд┐рди рд╡рд┐рдирд╛рд╢рдХрд╛рд░реА рдХреЗ рд▓рд┐рдП рд╕рд╛рджреГрд╢реНрдп рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛? рдЙрд╕рдХреЗ рдмрд┐рдирд╛ рдХрд╣рд╛рдБред рдореЙрдбрд▓ рд╡рд┐рдзреНрд╡рдВрд╕рдХреЛрдВ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рдХреНрд░рдо рдореЗрдВ рд╡рд░реНрдЧ рдкрджрд╛рдиреБрдХреНрд░рдо рдХреЛ рдкрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддрд░реНрдХ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ, рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрдХреНрд╖рд╛ рдореЗрдВ рдкрд╣рд▓реЗ рдХреА рддрд░рд╣ рдПрдХ рд╣реА SFINAE рд╡рд┐рдзрд┐ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЦреЛрдЬ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдпрджрд┐ рдХреЛрдИ рдХреЙрд▓ рд╣реИред рдкреНрд░рд╛рдпрд░рд▓реАрдЬреЗрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддрд░реНрдХ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдлрд╝рд╛рдЗрдирд▓реАрдХреЗрдХрд╕реНрдЯреНрд░рдХреНрдЪрд░ рдХреЗ рддрд░реНрдХ рдХреЗ рд╕рдорд╛рди рд╣реИ, рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рд░рд┐рд╡рд░реНрд╕ рдСрд░реНрдбрд░ рдореЗрдВред
рдЕрдм рд╡рд╕реНрддреБ рдХреЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рддреИрдпрд╛рд░ рд╣реЛрдиреЗ рдФрд░ рд╡рд╕реНрддреБ рдХреЗ рд╡рд┐рдирд╛рд╢ рд╕реЗ рдкрд╣рд▓реЗ рдХреБрдЫ рдЬрд╛рд░реА рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рд╡рд╕реНрддреБ рдХреЛ рдлрд┐рд░ рд╕реЗ рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд░рдиреЗ рдХрд╛ рдЕрд╡рд╕рд░ рд╣реИред рд▓реЗрдХрд┐рди рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдореЗрдВ, рдЖрдк рдПрдХ рдЕрдкрд╡рд╛рдж рдХреЛ рдлреЗрдВрдХрдХрд░ рд╕рдорд╕реНрдпрд╛ рдХреА рд░рд┐рдкреЛрд░реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕ рдореЙрдбрд▓ рдореЗрдВ рдПрдХ рд╣реА рд╡реНрдпрд╡рд╣рд╛рд░ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ: рдкрджрд╛рдиреБрдХреНрд░рдо рдореЗрдВ рдХрд┐рд╕реА рднреА рдлрд╝рд╛рдЗрдирд▓реАрдЬрдХреЙрдиреНрд╕реНрдЯреНрд░рдХреНрдЯ рд╡рд┐рдзрд┐ рдореЗрдВ, рдПрдХ рдЕрдкрд╡рд╛рдж рдХреЛ рдлреЗрдВрдХ рджрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдлрд╝рд╛рдЗрдирд▓рд┐рдЬрд╝рдХреЙрдиреНрд╕реНрдЯреНрд░рдХреНрдЯ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЗ рдмрд╛рдХреА рд╣рд┐рд╕реНрд╕реЛрдВ рдХреЛ рдЕрдм рдирд╣реАрдВ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдкрджрд╛рдиреБрдХреНрд░рдо рдХреА рдЙрди рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд▓рд┐рдП рдЬрд┐рдирдХреЗ рд▓рд┐рдП рдлрд╝рд╛рдЗрдирд▓реАрдХреЛрдиреНрд╕реНрдЯреНрд░рдХреНрдЯ рдкрд╣рд▓реЗ рд╣реА рдЧреБрдЬрд░ рдЪреБрдХрд╛ рд╣реИ, рдкрд╣рд▓реЗ рд╕реЗ рд╣реАRelease рдХреЛ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдХрд╣рд╛ рдЬрд╛рдПрдЧрд╛ред рдпрд╣ C ++ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░реНрд╕ рдФрд░ рдбрд┐рд╕реНрдЯреНрд░рдХреНрдЯрд░реНрд╕ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреВрд░реНрдг рд╕рд╛рджреГрд╢реНрдп рджреЗрддрд╛ рд╣реИред рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рд░рд┐рд▓реАрдЬрд╝ рд╡рд┐рдзрд┐ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗRelease рдХреЛ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рдП, рдФрд░ рдЬрдм PreRelease рдкрджрд╛рдиреБрдХреНрд░рдо рдХреЛ рдЯреНрд░реЗрд╕ рдХрд┐рдпрд╛ рдЬрд╛рдП, рддреЛ рдЗрд╕реЗ рдХреЗрд╡рд▓ рдЙрди рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЗ рд▓рд┐рдП рдХрд╣рд╛ рдЬрд╛рдПрдЧрд╛, рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдлрд▓ рдлрд╝рд╛рдЗрдирд▓рдХреЙрдиреНрд╕реНрдЯреНрд░рдХреНрдЯ рдХреЙрд▓ рдкрд╛рд╕ рд╣реБрдИ рд╣реИ, рдФрд░ рдХреЙрд▓ рдХреА рд╕рдлрд▓рддрд╛ CoClass (рдпрд╛рдж рд░рдЦреЗрдВ?) рдореЗрдВ рд╕реНрдерд┐рдд рдзреНрд╡рдЬ рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХреА рдЧрдИ рд╣реИред рдпрд╣ рднреА рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ рдЕрдЧрд░ рдХрдХреНрд╖рд╛ рдореЗрдВ рдЗрди рддрд░реАрдХреЛрдВ рдХреА рдЬреЛрдбрд╝реА рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рддреЛ рдХреЗрд╡рд▓ рдПрдХ рд╣реА рдореМрдЬреВрдж рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдпрджрд┐ рдмрд┐рд▓реНрдХреБрд▓ рднреАред
рдпрд╣ рддрд░реНрдХ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдиреА рд╣реБрдИ рд╣реИ
QueryInterface namespace Boss { namespace Private { template <typename T, bool IsImpl> struct QueryInterface; template <typename T, std::size_t I> struct QueryInterfacesListIter { template <typename ObjType> static RetCode Query(ObjType *obj, InterfaceId ifaceId, Ptr *iface) { typedef typename std::tuple_element<I, T>::type CurType; if (ifaceId == InterfaceTraits<CurType>::Id) { *iface = static_cast<CurType *>(obj); return Status::Ok; } return QueryInterfacesListIter<T, I - 1>::Query(obj, ifaceId, iface) == Status::Ok ? Status::Ok : QueryInterface<CurType, false>::Query(obj, ifaceId, iface); } }; template <typename T> struct QueryInterfacesListIter<T, -1> { template <typename ObjType> static RetCode Query(ObjType *, InterfaceId, Ptr *) { return Status::InterfaceNotFound; } }; template <typename T> struct QueryFromInterfacesList { template <typename ObjType> static RetCode Query(ObjType *obj, InterfaceId ifaceId, Ptr *iface) { typedef typename T::BaseInterfaces BaseInterfaces; enum { BaseInterfaceCount = std::tuple_size<BaseInterfaces>::value - 1 }; return QueryInterfacesListIter<BaseInterfaces, BaseInterfaceCount>::Query(obj, ifaceId, iface); } }; template <> struct QueryFromInterfacesList<IBase> { template <typename ObjType> static RetCode Query(ObjType *obj, InterfaceId ifaceId, Ptr *iface) { if (ifaceId == InterfaceTraits<IBase>::Id) { *iface = static_cast<IBase *>(obj); return Status::Ok; } return Status::InterfaceNotFound; } }; template < typename T, bool IsCoClass = std::is_base_of<CoClassAdditive, T>::value > struct QueryInterface { template <typename ObjType> static RetCode Query(ObjType *obj, InterfaceId ifaceId, Ptr *iface) { if (ifaceId == InterfaceTraits<T>::Id) { *iface = static_cast<T *>(obj); return Status::Ok; } return QueryFromInterfacesList<T>::Query(static_cast<T *>(obj), ifaceId, iface); } }; template <typename T, std::size_t I> struct QueryInterfaceIter { template <typename ObjType> static RetCode Query(ObjType *obj, InterfaceId ifaceId, Ptr *iface) { typedef typename std::tuple_element<I, T>::type CurType; return QueryInterface<CurType>::Query(static_cast<ObjType *>(obj), ifaceId, iface) == Status::Ok ? Status::Ok : QueryInterfaceIter<T, I - 1>::Query(obj, ifaceId, iface); } }; template <typename T> struct QueryInterfaceIter<T, -1> { template <typename ObjType> static RetCode Query(ObjType *obj, InterfaceId ifaceId, Ptr *iface) { return Status::InterfaceNotFound; } }; template <typename T> struct QueryInterface<T, true> { template <typename ObjType> static RetCode Query(ObjType *obj, InterfaceId ifaceId, Ptr *iface) { typedef typename T::BaseEntities BaseEntities; enum { BaseEntityCount = std::tuple_size<BaseEntities>::value - 1 }; return QueryInterfaceIter<BaseEntities, BaseEntityCount>::Query(static_cast<T *>(obj), ifaceId, iface); } }; } }
рдЬрд┐рд╕рдХреЗ рджреНрд╡рд╛рд░рд╛ рдФрд░ рдмрдбрд╝реЗ рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рдкрджрд╛рдиреБрдХреНрд░рдо рдЯреНрд░реИрд╡рд░реНрд╕рд▓ рд╕реЗ рдмрд╣реБрдд рдЕрд▓рдЧ рдирд╣реАрдВ рд╣реИред рдкрджрд╛рдиреБрдХреНрд░рдо рдХрд╛ рдЕрдиреБрд░реЗрдЦрдг рдХрд░рддреЗ рд╕рдордп рдФрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╡рд░реНрдЧ рдХреЗ рдкреЗрдбрд╝ рдореЗрдВ рдорд┐рд▓рддреЗ рд╕рдордп, рдЗрд╕рдХреА "рдЫрд▓" рдмреБрдирд┐рдпрд╛рджреА рд╕рдВрд╕реНрдерд╛рдУрдВ рдХреА рд╕реВрдЪреА рд▓реЗ рд▓реА рдЬрд╛рддреА рд╣реИ рдФрд░ рдпрд╣ рд╡рд╛рдВрдЫрд┐рдд рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреА рдЦреЛрдЬ рдореЗрдВ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХрд░ рдЬрд╛рддреА рд╣реИред рдПрдХ рдЬреЛрдбрд╝ рд╣реИред рдЪреВрдБрдХрд┐ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рдЦреЛрдЬ рдкрджрд╛рдиреБрдХреНрд░рдо рдореЗрдВ рдорд┐рд▓рдиреЗ рдкрд░, рдЕрдиреНрдп рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╕реЗ рдмрд╣реБрддрд╛рдпрдд рдореЗрдВ рдЖрдиреЗ рд╡рд╛рд▓реЗ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИ, рдпрд╣ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╡рд░реНрдЧ рдХреЛ рджрд░рдХрд┐рдирд╛рд░ рдХрд░рдиреЗ рдХреЗ рд╕рдорд╛рди рд╡рд╛рдВрдЫрд┐рдд рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рдЦреЛрдЬрдиреЗ рдХрд╛ рдкреНрд░рдмрдВрдзрди рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рдПрдХ "рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреА" рдЫрд▓ "рд╕реВрдЪреА" рдХреЗ рд╕рд╛рдеред
рдмреЙрд╕ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди :: IBase namespace Boss { template <typename T> class Base final : public T { public: Base(Base const &) = delete; Base const & operator = (Base const &) = delete; Base(Base &&) = delete; Base const & operator = (Base &&) = delete; template <typename ... Args> static RefObjPtr<T> Create(Args const & ... args) { Private::ModuleCounter::ScopedLock Lock; RefObjPtr<T> NewInst(new Base<T>(args ...)); Private::FinalizeConstruct<T>::Construct(NewInst.Get()); return std::move(NewInst); } private: std::atomic<UInt> Counter; template <typename ... Args> Base(Args const & ... args) : T(args ...) , Counter(0) { Private::ModuleCounter::AddRef(); } virtual ~Base() { Private::ModuleCounter::Release(); }
рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдФрд░ рдЕрдиреНрдп рд╕рд╣рд╛рдпрдХ рд╡рд░реНрдЧреЛрдВ рдХреА рд╡рд┐рд░рд╛рд╕рдд рдкрджрд╛рдиреБрдХреНрд░рдо рдореЗрдВ рдПрдХ рд╢реАрдЯ, рдФрд░ рдЗрд╕ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдХреЛ рдмрд╛рд╣рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рдЕрдВрддрд┐рдо рдХреАрд╡рд░реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдмрд╕ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреА рд╡рд╕реНрддреБрдУрдВ рдХреА рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдмрдирд╛рдиреЗ рдФрд░ рдЖрдЧреЗ рдмрдврд╝рдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдХреЛ рдмрд╛рд╣рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЗрд╕ рд╡рд░реНрдЧ рдХреЗ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЗрдВ рдпрд╣ рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВ, рд╕рднреА рдХреЛ рдЧреБрджрдЧреБрджрд╛рддреЗ рд╣реБрдПред рд╣рдЯрд╛рдП рдЬрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИредрдХреЛрд░ рддреИрдпрд╛рд░ рд╣реИ! рд╕рднреА рд╕рдмрд╕реЗ рдЬрдЯрд┐рд▓ рдФрд░ рджрд┐рд▓рдЪрд╕реНрдк рд╡рд░реНрдгрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЖрдЧреЗ рд╕рдм рдХреБрдЫ рдмрд╣реБрдд рд╕рд░рд▓ рдФрд░ рдЕрдзрд┐рдХ рднреА рд╣реЛрдЧрд╛, рдмрд┐рдирд╛ рдкрд╣реЗрд▓реА рдХреЗредрдкреНрд▓рдЧ-рдЗрди
рдЗрд╕ рднрд╛рдЧ рдореЗрдВ, рд╣рдо рдкреНрд▓рдЧрдЗрдиреНрд╕ рдХреЗ рд╕рдВрдЧрдарди рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░реЗрдВрдЧреЗред рд╡рд░реНрддрдорд╛рди рд╕рдВрджрд░реНрдн рдореЗрдВ, рдкреНрд▓рдЧ-рдЗрди рдХреЛ рдбрд╛рдпрдиреЗрдорд┐рдХ рд▓рд╛рдЗрдмреНрд░реЗрд░реА (.so / .dll) рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдордЭрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬреЛ рдЗрдВрдЯрд░рдлреЗрд╕ (рдШрдЯрдХреЛрдВ) рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрдХреНрд╖рд╛рдУрдВ рдХреЛ рд╣реЛрд╕реНрдЯ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрдХреНрд╖рд╛рдУрдВ рдХреА рд╡рд╕реНрддреБрдУрдВ рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдПрдХ рдЫреЛрдЯрд╛ рд╕рдореВрд╣ рд╣реИредрд▓реЗрдЦ рдХрд╛ рдпрд╣ рд╣рд┐рд╕реНрд╕рд╛, рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рд╕рдмрд╕реЗ рд╕рд░рд▓ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ "рдЯреЗрдореНрдкрд▓реЗрдЯ рдкрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ" рдФрд░ рд╕рдВрдХрд▓рдХ рдХреЗ рдЕрдиреНрдп рдирдХрд▓реАрдкрди рдирд╣реАрдВ рд╣реИред рдмрд╕ рдкреНрд▓рдЧ-рдЗрди рд╕рд┐рд╕реНрдЯрдо рдХреЗ рдЖрдпреЛрдЬрди рдХреЗ рд▓рд┐рдП рдЗрдВрдЯрд░рдлреЗрд╕ рдФрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдПрдХ рд╕реЗрдЯ рдмрдирд╛рдирд╛редрдЙрдирдХреЗ рдШрд░реЛрдВ рдореЗрдВ рдШрдЯрдХ рдХреЗ "рдЬреАрд╡рди" рдХреЗ рд▓рд┐рдП, рдПрдХ рд░рд╛рдЬреНрдп рдХреЗ рдврд╛рдВрдЪреЗ рдХреЗ рднреАрддрд░ (рдкреНрд▓рдЧ-рдЗрди), рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:- рдкреНрд▓рдЧрдЗрдиреНрд╕ / рдШрдЯрдХреЛрдВ / рд╕реЗрд╡рд╛рдУрдВ рдХреА рд░рдЬрд┐рд╕реНрдЯреНрд░реА
- рд╡рд░реНрдЧ рдХрд╛ рдХрд╛рд░рдЦрд╛рдирд╛
- рд▓реЛрдбрд░
рд╕реЗрд╡рд╛ рд░рдЬрд┐рд╕реНрдЯреНрд░реА - рд╕реЗрд╡рд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рднреА рдЬрд╛рдирдХрд╛рд░реА рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЬрдЧрд╣:- рд╕реЗрд╡рд╛ рдЖрдИрдбреА
- -
- (so / dll) ,
- Proxy/Stub' .
рдЗрд╕ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдХреНрд▓рд╛рд╕ рдлреИрдХреНрдЯреНрд░реА рдЖрд╡рд╢реНрдпрдХ рдкреНрд▓рдЧ-рдЗрди рдХреЛ рд▓реЛрдб рдХрд░рдиреЗ рдФрд░ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдЧреАредрд▓реЛрдбрд░ рдХреА рднреВрдорд┐рдХрд╛ рдШрдЯрдХ рд░рдЬрд┐рд╕реНрдЯреНрд░реА рдХреЛ рд▓реЛрдб рдХрд░рдиреЗ, рд╡рд░реНрдЧ рдХрд╛рд░рдЦрд╛рдиреЗ рдХреЛ рд▓реЛрдб рдХрд░рдиреЗ рдФрд░ рд╕реЗрд╡рд╛ рд░рдЬрд┐рд╕реНрдЯреНрд░реА рдХреЗ рд╕рд╛рде рдорд┐рд▓рдХрд░ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдХреА рд╣реИред рдЙрд╕рдХреЗ рдмрд╛рдж, рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рднреА рдХреЙрд▓ рдХреЗрд╡рд▓ рдХрд╛рд░рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реЛрдВрдЧреЗ рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдХреБрдЫ рдЕрдореВрд░реНрддрддрд╛ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддреА рд╣реИ, рдЙрд╕реЗ рдЪрд┐рдВрддрд╛ рдирд╣реАрдВ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдП рдХрд┐ рдЙрд╕рдХреА рд╡рд╕реНрддреБ рдХрд┐рд╕ рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рд╕реНрдерд┐рдд рд╣реИ рдФрд░ рдЗрд╕реЗ рдХреИрд╕реЗ рдмрдирд╛рдпрд╛ рдЬрд╛рдПред рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗрд╡рд▓ рдирдП рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░рддреЗ рд╕рдордп рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╡рд░реНрдЧ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИредрд╕реЗрд╡рд╛ рд░рдЬрд┐рд╕реНрдЯреНрд░реА рд╕рд┐рд░реНрдл рдПрдХ рд╡рд┐рдзрд┐ рдХреЗ рд╕рд╛рде рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреА рдЖрдкреВрд░реНрддрд┐ рдХрд░рддреА рд╣реИ, рдЬреЛ рд╡рд░реНрдЧ рдХрд╛рд░рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред namespace Boss { struct IServiceRegistry : public Inherit<IBase> { BOSS_DECLARE_IFACEID("Boss.IServiceRegistry") virtual RetCode BOSS_CALL GetServiceInfo(ClassId clsId, IServiceInfo **info) const = 0; }; }
рд▓реЗрдХрд┐рди рд╕реЗрд╡рд╛ рд░рдЬрд┐рд╕реНрдЯреНрд░реА рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╡рд░реНрдЧ рдЦреБрдж рдХрдИ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреА рдЖрдкреВрд░реНрддрд┐ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рд╕рдм рдХреНрдпрд╛ рдерд╛? рдЯрд╛рдЗрдкрд╕реЗрдЯ рдШрдЯрдХ рдмрдирд╛рдПрдВредрд╕реЗрд╡рд╛ рд░рдЬрд┐рд╕реНрдЯреНрд░реА рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╡рд░реНрдЧ namespace Boss { class ServiceRegistry : public CoClass < Service::Id::ServiceRegistry, IServiceRegistry, IServiceRegistryCtrl, ISerializable > { public: ServiceRegistry(); virtual ~ServiceRegistry(); private:
рдпрд╛рдиреА
рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд░рдЬрд┐рд╕реНрдЯреНрд░реА (IServiceRegistryCtrl) рдореЗрдВ рд╣реЗрд░рдлреЗрд░ рдХрд░рдиреЗ рдФрд░ рдЗрд╕реЗ рд▓реЛрдб рдХрд░рдиреЗ рдФрд░ рдЗрд╕реЗ рд╕рд╣реЗрдЬрдиреЗ (ISerializable) рдХреЗ рд▓рд┐рдП рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИредрдХрдХреНрд╖рд╛ рдХрд╛рд░рдЦрд╛рдирд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди namespace Boss { class ClassFactory : public CoClass < Service::Id::ClassFactory, IClassFactory, IClassFactoryCtrl > { public:
рдпрд╣ рдХрдИ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреА рднреА рдЖрдкреВрд░реНрддрд┐ рдХрд░рддрд╛ рд╣реИ: рдПрдХ рдкреНрд░рд╛рдердорд┐рдХ (IClassFactory), рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕рднреА рдЧреНрд░рд╛рд╣рдХ рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░реЗрдВрдЧреЗ, рдФрд░ рдПрдХ рджреНрд╡рд┐рддреАрдпрдХ (IClassFactoryCtrl), рдЬреЛ рд▓реЛрдбрд░ рд░рдЬрд┐рд╕реНрдЯреНрд░реА рдкрд░ рдХрд╛рд░рдЦрд╛рдиреЗ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИредрдмреВрдЯрд▓реЛрдбрд░ рдХреЛрдб рдХрд╛рдлреА рд╕рд░рд▓ рд╣реИ, рд▓реЗрдХрд┐рди, рджреБрд░реНрднрд╛рдЧреНрдпрд╡рд╢, C ++ 11 рдиреЗ рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо (OS) рдХреЛ рдереЛрдбрд╝рд╛ рдкрд╣рдЪрд╛рдирд╛ред рдЙрдиреНрд╣реЛрдВрдиреЗ рдорд▓реНрдЯреАрдереНрд░реЗрдбрд┐рдВрдЧ рдХреЛ рдорд╛рдиреНрдпрддрд╛ рджреА, рд▓реЗрдХрд┐рди рдЕрднреА рддрдХ рдЧрддрд┐рд╢реАрд▓ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдЬреИрд╕реА рдХреЛрдИ рдЪреАрдЬ рдирд╣реАрдВ рд╣реИред рдЗрд╕рд▓рд┐рдП рд▓реЛрдбрд┐рдВрдЧ рдореЙрдбреНрдпреВрд▓ рдХреЗ рд▓рд┐рдП рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЬрд░реВрд░ рдЧрд╣рд░рд╛ рдЫрд┐рдкрд╛ рд╣реИред PImple рдХреЛ рд╡рд╛рдкрд╕ рдмреБрд▓рд╛рдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ , рд▓реЗрдХрд┐рди рдЪреВрдБрдХрд┐ рдпрд╣ рдХреЛрд░реНрд╕ рд╕реНрдЯреИрдЯрд┐рдХ рд▓рд╛рдЗрдмреНрд░реЗрд░рд┐рдпреЛрдВ рдХреЛ рдЫреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рд▓рд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдереЛрдбрд╝рд╛ рдЕрд▓рдЧ рд╣реЛрдЧрд╛: рдкреНрд░рддреНрдпреЗрдХ рд╣реЗрдбрд░ рдХреЗ рд▓рд┐рдП рдЗрд╕рдХрд╛ рд╢реАрд░реНрд╖рдХ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдлрд╝рд╛рдЗрд▓ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдЬреЛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рддрд╛ рд╣реИ рдХрд┐ __linux__ рдФрд░ _WIN32 рдореИрдХреНрд░реЛрдЬрд╝ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдХреНрдпрд╛ рд╢рд╛рдорд┐рд▓ рдХрд┐рдпрд╛ рдЬрд╛рдПредрдПрдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рд░рд╣рдиреЗ рд╡рд╛рд▓реЗ рдкреНрд▓рдЧрдЗрди рдореЙрдбрд▓ рдХреЗ рдврд╛рдВрдЪреЗ рдХреЗ рднреАрддрд░ рд╕реЗрд╡рд╛рдУрдВ рдХреЗ рдЙрдкрдпреЛрдЧ рдХрд╛ рдПрдХ рдЫреЛрдЯрд╛ рд╕рд╛ рдЙрджрд╛рд╣рд░рдг: #include <iostream> #include "plugin/loader.h" #include "plugin/module.h" int main() { try { Boss::Loader Ldr("Registry.xml", "./libservice_registry.so", "./libclass_factory.so"); Boss::RefObjQIPtr<Boss::IBase> Inst; Inst = Ldr.CreateObject<Boss::IBase>(Boss::Crc32("MyClass")); } catch (std::exception const &e) { std::cerr << e.what() << std::endl; } return 0; }
рдЬреИрд╕рд╛ рдХрд┐ рдЕрдиреБрднрд╛рдЧ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд╕рдм рдХреБрдЫ рдХрд╛рдлреА рд╕рд░рд▓ рд╣реИ, рдпрд╣ рдХреЗрд╡рд▓ рд╕рд╣рд╛рдпрдХ рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдереЛрдбрд╝рд╛ рд╕рд╛ рд▓рд┐рдпрд╛редрдЙрджрд╛рд╣рд░рдг
рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдЙрджрд╛рд╣рд░рдг рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХрд╛рд░реНрдп рд╣реИ, рди рдХрд┐ рдПрдХ рдХреГрддреНрд░рд┐рдо рд░реВрдк рд╕реЗ рдЖрд╡рд┐рд╖реНрдХрд╛рд░ рдХрд┐рдП рдЧрдП рдкрд╛рдЗрд▓рд┐рдВрдЧ рдЬреЛ рдЕрдзрд┐рдХрддрдо рдпрд╛ рдЗрд╕ рдЕрд╡рд╕рд░ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИредрдКрдкрд░, рдХрд░реНрдиреЗрд▓ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреЗ рд╕рдордп, рдПрдХ рдмрд╣реБрдд рдмрдбрд╝рд╛ рдЙрджрд╛рд╣рд░рдг рджрд┐рдпрд╛ рдЧрдпрд╛, рдЬрд┐рд╕рдиреЗ рдореМрдЬреВрджрд╛ рд▓рдЪреАрд▓реЗрдкрди рдХреЛ рддреИрдпрд╛рд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕реЗ рд╕рдВрд╕реНрдерд╛рдУрдВ рдХреЛ рдЗрдХрдЯреНрдард╛ рдХрд░рдиреЗ рдФрд░ рдПрдХ рдирдпрд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛ред рд▓реЗрдХрд┐рди рдЙрджрд╛рд╣рд░рдг, рдЗрд╕ рддрдереНрдп рдХреЗ рдмрд╛рд╡рдЬреВрдж рдХрд┐ рдпрд╣ рдореЙрдбрд▓ рдХреА рдХреНрд╖рдорддрд╛рдУрдВ рдХреЛ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ, рдпрд╣ рд╡рдВрдЪрд┐рдд рд╣реИ рдФрд░ рдмрд╣реБрдд рдЕрдиреБрдХреВрд▓ рдирд╣реАрдВ рджрд┐рдЦрддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдо рдкреНрд▓рдЧ-рдЗрди рднрд╛рдЧ рдХреЗ рдЖрд╡рд╢реНрдпрдХ рдШрдЯрдХреЛрдВ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЕрд░реНрдерд╛рддреН рд╕реЗрд╡рд╛рдУрдВ рдХреА рд░рдЬрд┐рд╕реНрдЯреНрд░реА рдФрд░ рд╡рд░реНрдЧ рдХрд╛рд░рдЦрд╛рдирд╛ред рдпрджреНрдпрдкрд┐ рд╡реЗ рдкреНрд▓рдЧ-рдЗрди рдореЙрдбрд▓ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИрдВ, рд╡реЗ рдПрдХ рд╣реА рдкреНрд▓рдЧ-рдЗрди рд╣реИрдВ рдЬреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЕрдкрдиреА рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рд╡рд┐рдХрд╕рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВредрдПрдХ рдмрд╛рд░ рдлрд┐рд░ рдореИрдВ рд╕реЗрд╡рд╛рдУрдВ рдХреА рд░рдЬрд┐рд╕реНрдЯреНрд░реА рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд░реНрдЧ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рджреВрдВрдЧрд╛редрд╕реЗрд╡рд╛ рд░рдЬрд┐рд╕реНрдЯреНрд░реА рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди namespace Boss { class ServiceRegistry : public CoClass < Service::Id::ServiceRegistry, IServiceRegistry, IServiceRegistryCtrl, ISerializable > { public: ServiceRegistry(); virtual ~ServiceRegistry(); private:
рдЕрдм рдпрд╣рд╛рдБ рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИ рдЗрд╕рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ ...рдПрдХ рдпрд╛ рдЕрдзрд┐рдХ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рд▓рд┐рдП рдПрдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╡рд░реНрдЧ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ CoClass рдЯреЗрдореНрдкреНрд▓реЗрдЯ рд╡рд░реНрдЧ рд╕реЗ рд╡реНрдпреБрддреНрдкрдиреНрди рд╡рд░реНрдЧ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрд╣ рд╡рд░реНрдЧ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╡рд░реНрдЧ рдХреЗ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ (рдЬреЛ рдХрд┐ рдХреНрд▓рд╛рд╕ рдлреИрдХреНрдЯреНрд░реА рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╡рд╕реНрддреБ рдмрдирд╛рддреЗ рд╕рдордп рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ) рдФрд░ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рд╡рдВрд╢рд╛рдиреБрдЧрдд рдЗрдВрдЯрд░рдлреЗрд╕ рдпрд╛ рддреИрдпрд╛рд░-рдХрд┐рдП рдЧрдП рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рдПрдХ рд╕реВрдЪреАред рдпрджрд┐ рдЖрдк рд╕реЗрд╡рд╛ рд░рдЬрд┐рд╕реНрдЯреНрд░реА рдХреЗ рджрд┐рдП рдЧрдП рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╡рд░реНрдЧ рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдЗрд╕рдореЗрдВ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ (рд╕реЗрд╡рд╛ :: Id :: ServiceRegistry) рдФрд░ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЗрдВрдЯрд░рдлреЗрд╕ рд╣реИрдВ рдЬреЛ рдЗрд╕ рд╡рд░реНрдЧ рдореЗрдВ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ (IServiceRegistry - рдЙрд╕ рд╕реЗрд╡рд╛ рдХрд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдЬреЛ рдХреНрд▓рд╛рд╕ рдлреИрдХреНрдЯреНрд░реА рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛; ISrviceRegistryCtrl - рд░рдЬрд┐рд╕реНрдЯреНрд░реА рдкреНрд░рдмрдВрдзрди рдЗрдВрдЯрд░рдлрд╝реЗрд╕; ISerializable - рд░рдЬрд┐рд╕реНрдЯреНрд░реА рдХреЛ рдХрд╣реАрдВ рд╕реЗ рд╕рд╣реЗрдЬрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдХрд╣реАрдВ рд╕реЗ рд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рдпрд╣ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдЖрдкрдХреЛ рд╡рд╣ рдкреНрд░рджрд░реНрд╢рди рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдЬреЛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ)редрдЗрд╕ рдкрд░, рдХрдВрдкреЛрдиреЗрдВрдЯ рдмрдирд╛рдиреЗ рдХрд╛ рд╕рд╛рд░рд╛ рдХрд╛рдо рдкреВрд░рд╛ рд╣реЛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдЖрдкрдХреЛ рд╕рд┐рд░реНрдл рдЗрд╕рдХреЗ рддрд░реАрдХреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИредрдШрдЯрдХ рддреИрдпрд╛рд░ рд╣реИред рдпрд╣ рдХрд┐рд╕реА рднреА рддрд░рд╣ рдЗрд╕реЗ рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдиреА рд╣реБрдИ рд╣реИ, рдЕрд░реНрдерд╛рдд рдЙрд╕ рдореЙрдбреНрдпреВрд▓ рдХреЗ рдмрд╛рд╣рд░ рд╕реЗ рдЗрд╕реЗ рдПрдХреНрд╕реЗрд╕ рджреЗрдирд╛ рдЬрд┐рд╕рдореЗрдВ рдпрд╣ рд╕реНрдерд┐рдд рд╣реИредрдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдХреНрд░реЛ BOSS_DECLARE_MODULE_ENTRY_POINT рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ #include "service_registry.h" #include "plugin/module.h" namespace { typedef std::tuple < Boss::ServiceRegistry > ExportedCoClasses; } BOSS_DECLARE_MODULE_ENTRY_POINT("ServiceRegistry", ExportedCoClasses)
рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЛ рдореИрдХреНрд░реЛ рдХреЛ рдкрд╛рд╕ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╕реЗ CRC32 рдХреА рдЧрдгрдирд╛ рдХреА рдЬрд╛рдПрдЧреА, рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдореЙрдбреНрдпреВрд▓ рдХреА рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдФрд░ рд╡рд░реНрдЧ рдореЙрдбреНрдпреВрд▓ рдХреА рд╕реВрдЪреА рдХреЗ рд░реВрдк рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ рдЗрд╕ рдореЙрдбреНрдпреВрд▓ рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдпрд╛рдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рдЬрд┐рд╕рдХреЗ рдмрд╛рдж рдШрдЯрдХ рдФрд░ рдЙрд╕рдХреЗ рдореЙрдбреНрдпреВрд▓ рддреИрдпрд╛рд░ рд╣реИрдВ (рдФрд░ рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рдХрдИ рдШрдЯрдХ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ), рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд░рдЬрд┐рд╕реНрдЯреНрд░реА рдореЗрдВ рдкрдВрдЬреАрдХрд░рдг рдХрд░рдХреЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рдЕрдкрд╡рд╛рдж: рдореЙрдбрд▓ рдХреЗ рд╕рд╛рдорд╛рдиреНрдп рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рд╕реЗрд╡рд╛рдУрдВ рдХреА рд░рдЬрд┐рд╕реНрдЯреНрд░реА рдФрд░ рд╡рд░реНрдЧ рдХрд╛ рдХрд╛рд░рдЦрд╛рдирд╛ рдкрдВрдЬреАрдХреГрдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ)редрдПрдХ рдЕрдиреНрдп рд╕рдорд╛рди рдЙрджрд╛рд╣рд░рдг: рдПрдХ рд╡рд░реНрдЧ рдХрд╛рд░рдЦрд╛рдиреЗ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди, рдЬреЛ рдКрдкрд░ рднреА рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИредрд╡рд░реНрдЧ рдХрд╛ рдХрд╛рд░рдЦрд╛рдирд╛ namespace Boss { class ClassFactory : public CoClass < Service::Id::ClassFactory, IClassFactory, IClassFactoryCtrl > { public:
рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдПрдХ рдЬреИрд╕рд╛ рдЙрджрд╛рд╣рд░рдгред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ CoClass рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд, рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдФрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдЗрдВрдЯрд░рдлреЗрд╕ рдХреА рдПрдХ рд╕реВрдЪреАред рд╡рд░реНрдЧ рдХрд╛рд░рдЦрд╛рдирд╛ рдПрдХ рдЕрд▓рдЧ рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рд╕реНрдерд┐рдд рд╣реИ, рдХреНрд░рдорд╢рдГ, рдЗрд╕рдХрд╛ рдЕрдкрдирд╛ рд╣реИрдкреНрд░рд╡реЗрд╢ рдмрд┐рдВрджреБ #include "class_factory.h" #include "plugin/module.h" namespace { typedef std::tuple < Boss::ClassFactory > ExportedCoClasses; } BOSS_DECLARE_MODULE_ENTRY_POINT("ClassFactory", ExportedCoClasses)
рд╕реЗрд╡рд╛рдУрдВ рдХреА рд░рдЬрд┐рд╕реНрдЯреНрд░реА рдХреЗ рд▓рд┐рдП рдПрдХ рд╣реА рдкреНрд░рд╡реЗрд╢ рдмрд┐рдВрджреБредрдпреЗ рд╕рд░рд▓ рдШрдЯрдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдереЗ рдЬрд┐рд╕рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдШрдЯрдХ рдХреЛ рдХреЗрд╡рд▓ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреА рдПрдХ рд╕реВрдЪреА рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓реА, рдЙрдирдХреЗ рддрд░реАрдХреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛, рдФрд░ рдпрд╣ рд╕рдмред рддреИрдпрд╛рд░ рдХрд┐рдП рдЧрдП рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рдХреЛрдИ рд╡рд┐рд░рд╛рд╕рдд рдирд╣реАрдВ рдереАред рдФрд░ рдпрджрд┐ рдЖрдк рд╕реЗрд╡рд╛рдУрдВ рдХреЗ рд░рдЬрд┐рд╕реНрдЯреНрд░реА рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рдлрд┐рд░ рд╕реЗ рджреЗрдЦрддреЗ рд╣реИрдВ, рддреЛ рдЗрд╕рдореЗрдВ рдЖрдкрдХреЛ IServiceInfo рдХреЗ рд╕рд╛рде рдХрд╛рдо рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛, рдЬрд┐рд╕рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕рднреА рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╕рд╛рд░рд┐рдд рд╣реЛрддреА рд╣реИред IServiceInfo рдХреЗрд╡рд▓ рдПрдХ рд╕реЗрд╡рд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рд╛рдорд╛рдиреНрдп рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╕рд╛рд░рд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рдирд┐рдЬреА рднреА рд╣реИред рдкреНрд░рд╛рд░рдВрдн рдореЗрдВ, рдореИрдВ рдкреНрд▓рдЧрдЗрдиреНрд╕ рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ рдЬреЛ рди рдХреЗрд╡рд▓ рдЧрддрд┐рд╢реАрд▓ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдореЗрдВ рд░рд╣рддреЗ рд╣реИрдВ, рдмрд▓реНрдХрд┐ рдЙрдирдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдореЗрдВ рднреА рдмрд┐рдЦрд░реЗ рд╣реБрдП рд╣реИрдВред рдЗрд╕рд▓рд┐рдП, рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЬрд╛рдирдХрд╛рд░реА: рдЧрддрд┐рд╢реАрд▓ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдореЗрдВ рдкреНрд▓рдЧрдЗрдиреНрд╕ рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рдЗрд╕рдХреЗ рд▓рд┐рдП рдкрде рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рд╣реИ, рдФрд░ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рдкреНрд▓рдЧрдЗрдиреНрд╕ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЕрдзрд┐рдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдЬрд╛рдирдХрд╛рд░реА рд╣реИ: рдкреНрд░реЙрдХреНрд╕реА / рд╕реНрдЯрдмреНрд╕, рдкрд░рд┐рд╡рд╣рди, рдЖрджрд┐ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реАред (рд▓реЗрдХрд┐рди, рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдореИрдВрдиреЗ рдЗрд╕ рд╣рд┐рд╕реНрд╕реЗ рдХреЛ рдЦрддреНрдо рдирд╣реАрдВ рдХрд┐рдпрд╛, рд▓реЗрдХрд┐рди рд░реВрдврд╝рд┐рдпреЛрдВ рдХреЛ рдХрд╛рдЯ рджрд┐рдпрд╛,рддрд╛рдХрд┐ рдЦрд╛рдорд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдХреЛрдб рдХреВрдбрд╝реЗ рдирд╣реАрдВ)ред рдЕрдм рдореИрдВ рд╕рд┐рд░реНрдл рдПрдХ рдЙрджрд╛рд╣рд░рдг рджреВрдВрдЧрд╛ рдЬрд┐рд╕рдореЗрдВ рдШрдЯрдХ рди рдХреЗрд╡рд▓ рдЗрдВрдЯрд░рдлреЗрд╕ рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓реЗ рд╣реИрдВ, рдмрд▓реНрдХрд┐ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕реЗ рднреА рд╣реИрдВредрд╕реЗрд╡рд╛ рдХреА рдЬрд╛рдирдХрд╛рд░реА рд▓рд╛рдЧреВ рдХрд░рдирд╛ #ifndef __BOSS_PLUGIN_SERVICE_INFO_H__ #define __BOSS_PLUGIN_SERVICE_INFO_H__ #include "../core/base.h" #include "../core/error_codes.h" #include "../core/ref_obj_ptr.h" #include "../common/enum.h" #include "../common/entity_id.h" #include "../common/string.h" #include "iservice_info.h" #include <string> namespace Boss { namespace Private { template <typename T, bool = !!std::is_base_of<IServiceInfo, T>::value> class ServiceInfo; template <typename T> class ServiceInfo<T, true> : public CoClass<Crc32("Boss.ServiceInfo"), T> { public: // тАж void SetServiceId(ServiceId srvId) { // ... } void AddCoClassId(ClassId clsId) { // ... } void AddCoClassIds(RefObjPtr<IEnum> coClassIds) { // ... } private: // тАж // IServiceInfo virtual RetCode BOSS_CALL GetServiceId(ServiceId *serviceId) const { // ... } virtual RetCode BOSS_CALL GetClassIds(IEnum **ids) const { // ... } }; } class LocalServiceInfo : public CoClass<Crc32("Boss.LocalServiceInfo"), Private::ServiceInfo<ILocalServiceInfo>> { public: void SetModulePath(std::string const &path) { // ... } void SetModulePath(RefObjPtr<IString> path) { // ... } private: // ... // ILocalServiceInfo virtual RetCode BOSS_CALL GetModulePath(IString **path) const { // ... } }; class RemoteServiceInfo : public CoClass<Crc32("Boss.RemoteServiceInfo"), Private::ServiceInfo<IRemoteServiceInfo>> { public: void SetProps(RefObjPtr<IPropertyBag> props) { // ... } private: // ... // IRemoteServiceInfo virtual RetCode BOSS_CALL GetProperties(IPropertyBag **props) const { // ... } }; } #endif // !__BOSS_PLUGIN_SERVICE_INFO_H__
ServiceInfo рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдереЛрдбрд╝рд╛ рдЬрдЯрд┐рд▓ рд▓рдЧ рд╕рдХрддрд╛ рд╣реИред рдпрд╣рд╛рдБ рдПрдХ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреНрдпреЛрдВ рд╣реИ? рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рд╣реБрдИ рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рд╕реВрдХреНрд╖реНрдорддрд╛ рд╣реИ, рдФрд░ рдШрдЯрдХ рдореЙрдбрд▓ / рдкреНрд▓рдЧ-рдЗрди рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд▓рд┐рдП рд╢реНрд░рджреНрдзрд╛рдВрдЬрд▓рд┐ рдирд╣реАрдВ рд╣реИред рдЗрд╕ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдХрд╛рд░рдг рдХреЛ рдереЛрдбрд╝рд╛ рд╕реНрдкрд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рджреВрдВрдЧрд╛:рд╕реЗрд╡рд╛ рд╕реВрдЪрдирд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ #ifndef __BOSS_PLUGIN_ISERVICE_INFO_H__ #define __BOSS_PLUGIN_ISERVICE_INFO_H__ #include "../core/ibase.h" #include "../common/ienum.h" #include "../common/istring.h" #include "../common/iproperty_bag.h" namespace Boss { struct IServiceInfo : public Inherit<IBase> { BOSS_DECLARE_IFACEID("Boss.IServiceInfo") virtual RetCode BOSS_CALL GetServiceId(ServiceId *serviceId) const = 0; virtual RetCode BOSS_CALL GetClassIds(IEnum **ids) const = 0; }; struct ILocalServiceInfo : public Inherit<IServiceInfo> { BOSS_DECLARE_IFACEID("Boss.ILocalServiceInfo") virtual RetCode BOSS_CALL GetModulePath(IString **path) const = 0; }; struct IRemoteServiceInfo : public Inherit<IServiceInfo> { BOSS_DECLARE_IFACEID("Boss.IRemoteServiceInfo") virtual RetCode BOSS_CALL GetProperties(IPropertyBag **props) const = 0; }; } #endif // !__BOSS_PLUGIN_ISERVICE_INFO_H__
рдЗрдВрдЯрд░рдлреЗрд╕ рдФрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рд╡рд┐рд░рд╛рд╕рдд рдХреЗ рд╕рд╛рде рдереЛрдбрд╝рд╛ рдФрд░ рдЕрдзрд┐рдХ рд╕рдордЭрдиреЗ рдпреЛрдЧреНрдп рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд░реНрдиреЗрд▓ рд╡рд┐рд╡рд░рдг рдореЗрдВ рдлреИрдВрд╕реА Face123456 рд╡рд░реНрдЧ рдХреЗ рд╕рд╛рде рдмрд┐рдирд╛ рдХрд┐рд╕реА рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЗ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ :)рдШрдЯрдХреЛрдВ рдХреЛ рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдП рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реЛ рдЧрдпрд╛ред рд╕рдм рдХреБрдЫ рд╕рд░рд▓ рд╣реИред рдФрд░ рдПрдХ рджреВрд╕рд░реЗ рд╕реЗ рдХреНрд╡реЗрд░реА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рд╕рд╛рде рдХреНрд╡реЗрд░реА рдФрд░ рдХрд╛рдо рдХреИрд╕реЗ рдХрд░реЗрдВ - рдЖрдк рдПрдХ рдмреВрдЯрд▓реЛрдбрд░ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рд╕реЗрд╡рд╛рдУрдВ рдХреА рдПрдХ рд░рдЬрд┐рд╕реНрдЯреНрд░реА рд▓реЛрдб рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд╕реЗ рдЖрд╡рд╢реНрдпрдХ рдЗрдВрдЯрд░рдлреЗрд╕ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ, рдЗрд╕ рд░рдЬрд┐рд╕реНрдЯреНрд░реА рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рддрд╛ рд╣реИ, рд╡рд░реНрдЧ рдХрд╛рд░рдЦрд╛рдиреЗ рдХреЛ рд▓реЛрдб рдХрд░рддрд╛ рд╣реИ рдФрд░ рд░рдЬрд┐рд╕реНрдЯреНрд░реА рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рд╕рднреА рдЧреНрд░рд╛рд╣рдХ рдХрд╛ рдХрд╛рдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХреНрд▓рд╛рд╕ рдлреИрдХреНрдЯреНрд░реА рдХреЗ рд╕рд╛рде рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рдЕрдм рдореЙрдбреНрдпреВрд▓ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЕрдиреНрдпрдерд╛, рдХрд┐рд╕ рд▓рд┐рдП, рдпрд╣ рд╕рдм рдЕрдореВрд░реНрддрддрд╛ рд╢реБрд░реВ рдХреА рдЧрдИ рдереАредрд▓реЛрдбрд░ #ifndef __BOSS_PLUGIN_LOADER_H__ #define __BOSS_PLUGIN_LOADER_H__ #include "iservice_registry.h" #include "iclass_factory.h" #include "iclass_factory_ctrl.h" #include "module_holder.h" #include "service_ids.h" #include "core/exceptions.h" #include "common/file_stream.h" #include "common/iserializable.h" #include <string> namespace Boss { BOSS_DECLARE_RUNTIME_EXCEPTION(Loader) class Loader final { public: Loader(Loader const &) = delete; Loader& operator = (Loader const &) = delete; Loader(std::string const ®istryFilePath, std::string const &srvRegModulePath, std::string const &clsFactoryModulePath) : SrvRegistry([&] () { auto SrvRegModule(ModuleHolder(std::move(DllHolder(srvRegModulePath)))); auto SrvReg = SrvRegModule.CreateObject<IServiceRegistry>(Service::Id::ServiceRegistry); RefObjQIPtr<ISerializable> Serializable(SrvReg); if (!Serializable.Get()) throw LoaderException("Failed to get ISerializable interface from Registry object."); if (Serializable->Load(Base<IFileStream>::Create(registryFilePath).Get()) != Status::Ok) throw LoaderException("Failed to load Registry."); return std::move(std::make_pair(std::move(SrvRegModule), std::move(SrvReg))); } ()) , ClsFactory([&] () { auto ClassFactoryModule(ModuleHolder(std::move(DllHolder(clsFactoryModulePath)))); auto NewClsFactory = ClassFactoryModule.CreateObject<IClassFactory>(Service::Id::ClassFactory); RefObjQIPtr<IClassFactoryCtrl> Ctrl(NewClsFactory); if (!Ctrl.Get()) throw LoaderException("Failed to get ICalssFactoryCtrl interface from ClassFactory object."); if (Ctrl->SetRegistry(SrvRegistry.second.Get()) != Status::Ok) throw LoaderException("Failed to set Registry into ClassFactory."); return std::move(std::make_pair(std::move(ClassFactoryModule), std::move(NewClsFactory))); } ()) { } template <typename T> RefObjPtr<T> CreateObject(ClassId clsId) { RefObjPtr<IBase> NewInst; if (ClsFactory.second->CreateObject(clsId, NewInst.GetPPtr()) != Status::Ok) throw LoaderException("Failed to create object."); RefObjQIPtr<T> Ret(NewInst); if (!Ret.Get()) throw LoaderException("Interface not found."); return Ret; } ~Loader() { ClsFactory.second.Release(); SrvRegistry.second.Release(); } private: std::pair<ModuleHolder, RefObjPtr<IServiceRegistry>> SrvRegistry; std::pair<ModuleHolder, RefObjPtr<IClassFactory>> ClsFactory; }; } #endif // !__BOSS_PLUGIN_LOADER_H__
рдЙрдкрд░реЛрдХреНрдд рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рдЕрд▓рд╛рд╡рд╛, C ++ 03 рдореЗрдВ рдкрд┐рдЫрд▓реЗ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╕рд╛рде рд▓реЗрдЦ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд╣реИрдВред рдПрдХрдорд╛рддреНрд░ рдЕрдВрддрд░ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рд╣реИред рдирдП рдореЙрдбрд▓ рдореЗрдВ, рдЖрдкрдХреЛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╡рд░реНрдЧ рдореЗрдВ рдПрдХ рдЕрд▓рдЧ рдореИрдХреНрд░реЛ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЖрдк рднреВрд▓ рд╕рдХрддреЗ рд╣реИрдВред рдпрджрд┐ рдЖрдк рдирдП рдореЙрдбрд▓ рдореЗрдВ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рднреВрд▓ рдЬрд╛рддреЗ рд╣реИрдВ, рддреЛ рд╕рдВрдХрд▓рдХ рдЖрдкрдХреЛ рдЗрд╕рдХреА рдпрд╛рдж рджрд┐рд▓рд╛рдПрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдЕрдм рдпрд╣ рдПрдХ рдЯреЗрдореНрдкрд▓реЗрдЯ рдкреИрд░рд╛рдореАрдЯрд░ рд╣реИредрдирд┐рд╖реНрдХрд░реНрд╖
рдХреБрдЫ рдмрдбрд╝рд╛ рд╡рд┐рдЪрд╛рд░ рдерд╛, рд▓реЗрдХрд┐рди рдпрд╣ рдХреЗрд╡рд▓ 2/3 рдкрд░ рд╣реА рд╕рд╛рдХрд╛рд░ рд╣реЛ рдЧрдпрд╛:- рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдХреЛрд░
- рдкреНрд▓рдЧ-рдЗрди рд╕рд┐рд╕реНрдЯрдо рдХреЗ рдЕрд╕реНрддрд┐рддреНрд╡ рдХреЗ рд▓рд┐рдП рдмреБрдирд┐рдпрд╛рджреА рд╕реЗрд╡рд╛рдУрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛
- рдЕрдиреНрдп рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдореЗрдВ рд░рд╣рдиреЗ рд╡рд╛рд▓реЗ рдкреНрд▓рдЧрдЗрдиреНрд╕ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рдирд╣реАрдВ рд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рд╕рднреА рд░реВрдврд╝рд┐рдпреЛрдВ рдХреЛ рдХрд╛рдЯ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рддрд╛рдХрд┐ рдХреЛрдб рдХреЛ рд░реЛрдХрдирд╛ рди рдкрдбрд╝реЗ
рдХрд┐рд╕реА рддрд░рд╣ рдпрд╣ рд╣реБрдЖ рдХрд┐ рдореЗрд░реЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рджрд┐рд▓рдЪрд╕реНрдк рдХреНрд╖рдг рдПрдХ рдкреНрд░рдгрд╛рд▓реА рдХрд╛ рдХрдВрдХрд╛рд▓ рдпрд╛ рдХрдВрдХрд╛рд▓ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рдирд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдорд╛рдВрд╕рдкреЗрд╢рд┐рдпреЛрдВ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдФрд░ рд╡рд╕рд╛ рдХреЛ рдЗрдВрдЬреЗрдХреНрдЯ рдХрд░рдирд╛ (рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреА рдЙрдкрдпреЛрдЧрд┐рддрд╛ / рдЫрджреНрдо рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдХреЛ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдирд╛) рдХрднреА-рдХрднреА рдПрдХ рдРрд╕рд╛ рдХрд╛рдо рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рдЕрдЪреНрдЫреЗ рдЬреНрдЮрд╛рди рдХреЗ рдХрд╛рд░рдг рдмрд╣реБрдд рдЕрдзрд┐рдХ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдПрдХ рдмрд╣реБрдд рд╣реА рдкреВрд░реНрдг (рдХрднреА-рдХрднреА рдЕрддреНрдпрдзрд┐рдХ рднрд░рд╛ рд╣реБрдЖ) рдХреЛрд░ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ (рд╡реИрдХреНрдпреВрдо рдореЗрдВ рдЧреЛрд▓рд╛рдХрд╛рд░ рдШреЛрдбрд╝реЛрдВ рдиреЗ рд╣рдореЗрд╢рд╛ рдореБрдЭреЗ рдЖрдХрд░реНрд╖рд┐рдд рдХрд┐рдпрд╛)ред рдорд╛рдВрд╕рдкреЗрд╢рд┐рдпреЛрдВ рдХрд╛ рдПрдХ рдЫреЛрдЯрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИ (рдкреНрд▓рдЧ-рдЗрди рд╕рд┐рд╕реНрдЯрдо рдХреЗ рдореБрдЦреНрдп рдШрдЯрдХ: рд╕реЗрд╡рд╛рдУрдВ рдХреА рдПрдХ рд░рдЬрд┐рд╕реНрдЯреНрд░реА рдФрд░ рдПрдХ рд╡рд░реНрдЧ рдХрд╛рд░рдЦрд╛рдирд╛) рддрд╛рдХрд┐ рдореЙрдбрд▓ рдХрд┐рд╕реА рддрд░рд╣ рдореМрдЬреВрдж рд╣реЛ рд╕рдХреЗред рд▓реЗрдХрд┐рди рдпрд╣ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╡рд╕рд╛ рд░рд╣рд┐рдд рд╣реЛ рдЧрдпрд╛: рдЗрд╕рдореЗрдВ рдХреБрдЫ рднреА рд╕рд╣рд╛рдпрдХ рдирд╣реАрдВ рд╣реИред рд╕рд┐рд╕реНрдЯрдо рдХреЗ рдХрдВрдХрд╛рд▓ рдХреЛ рдЗрдХрдЯреНрдард╛ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдереЛрдбрд╝рд╛ рд╕рд╛ рдорд╛рдВрд╕рдкреЗрд╢рд┐рдпреЛрдВ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдФрд░ рдЧрдзреЗ рдореЗрдВ рдПрдХ рдХрд┐рдХ рджреА рдЧрдИ рдереА, рддрд╛рдХрд┐ рдХрдо рд╕реЗ рдХрдо рдХрд┐рд╕реА рддрд░рд╣ рдпрд╣ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рд╣реЛ рдЬрд╛рдП - рдпрд╣ рд╣реИрдмрд░ рдХреА рд╕рд╛рдордЧреНрд░реА рдФрд░ рд▓реЗрдЦ рдмрди рдЧрдпрд╛редрдПрдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЛ рдпрд╛ рддреЛ рдЬрд╛рд░реА рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдпрд╛ рдЬрд┐рддрдиреА рдЬрд▓реНрджреА рд╣реЛ рд╕рдХреЗ рдмрдВрдж рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬрдм рддрдХ рдХрд┐ рдпрд╣ рд╕рднреА рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЛ рдЦрд╛ рдирд╣реАрдВ рдЧрдпрд╛ рд╣реИ рдФрд░ рд╕реНрдкреЙрдЯрд▓рд╛рдЗрдЯ рд╕реЗ рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рдЧрд╛рдпрдм рд╣реЛ рдЧрдпрд╛ рд╣реИред рдЗрд╕ рдирд┐рд░реНрдгрдп рдФрд░ рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рдХрд┐ рд▓реЗрдЦ рдХреА рд╕рд╛рдордЧреНрд░реА рдереЛрдбрд╝реА рдмрдбрд╝реА рд╣реЛ рдЧрдИ рд╣реИ рдФрд░, рд╢рд╛рдпрдж, рдХреБрдЫ рд╕реНрдерд╛рдиреЛрдВ рдореЗрдВ рдЬрдЯрд┐рд▓ рд╣реИ, рдФрд░ рдХрд╛рд░рдг рдпрд╣ рд╣реИ рдХрд┐ рдореИрдВ рдЗрд╕ рд▓реЗрдЦ рдкрд░ рдЫрд╣ рдорд╣реАрдиреЗ рд╕реЗ рдЕрдзрд┐рдХ рд╕рдордп рддрдХ рдзреНрдпрд╛рди рдирд╣реАрдВ рджреЗ рдкрд╛рдпрд╛ рдерд╛, рдкреНрд▓рдЧрдЗрдиреНрд╕ рд╡рд╛рд▓рд╛ рд╣рд┐рд╕реНрд╕рд╛ рдЕрднреА рддрдХ рдЙрдкрд▓рдмреНрдз рдирд╣реАрдВ рд╣реИред рдЬрд▓реНрдж рд╣реА, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, C ++ 14 рджрд┐рдЦрд╛рдИ рджреЗ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ C ++ 11 рдХреЛ рд╕рдорд░реНрдкрд┐рдд рдЗрд╕ рд▓реЗрдЦ рдХреА рд╕рд╛рдордЧреНрд░реА рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЕрдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд╣реЛ рд╕рдХрддреА рд╣реИред рдпрд╣ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЕрд╡рд╛рд╕реНрддрд╡рд┐рдХ рднрд╛рдЧ рдХреЛ рдПрдХ рдЕрд▓рдЧ рдкреЛрд╕реНрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдЬрд╛рд░реА рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ ... рдпрд╣ рд╕рд╛рдордЧреНрд░реА рдкреНрд░реЙрдХреНрд╕реА / рд╕реНрдЯрдмреНрд╕ рдбреЛ-рдЗрдЯ-рдЦреБрдж рд▓реЗрдЦ рдХреА рд╕рд╛рдордЧреНрд░реА рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реЛрдЧреА , рдЬрд┐рд╕реЗ рдореИрдВ C ++ 11 рдорд╛рдирдХ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдлрд┐рд░ рд╕реЗ рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛, рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкрд╛рд░реНрд╢рд▓рд┐рдВрдЧ рдЬреЛрдбрд╝реЗрдВ рдФрд░ рдЗрд╕рдХреЗ рддрд╣рдд рд╕рднреА рдкрд░рд┐рд╡рд╣рди рдХреЛ рд▓рд╛рдЧреВ рдХрд░реЗрдВ (рддрдВрддреНрд░ рдореЗрдВ рд╕реЗ рдПрдХ рдХреЛ рд▓рд╛рдЧреВ рдХрд░реЗрдВ) рдЖрдИрдкреАрд╕реА)редрджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ рдФрд░ рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рдЦреБрд╢реА рд╣реЛрддреА рд╣реИ, рдкрд╛рдардХ рд╣рдореЗрд╢рд╛ рдЕрдкрдиреЗ рдХрд╛рдо рд╕реЗ рд▓реЗрдЦрдХ рдХреА рдкреВрд░реА рдпреЛрдЬрдирд╛ рдХреЛ рдмрд╛рд╣рд░ рдирд╣реАрдВ рдирд┐рдХрд╛рд▓рддрд╛ рд╣реИ, рдЬреЛ рдЙрд╕рдиреЗ рдЙрд╕рдореЗрдВ рд░рдЦреА рдереАред рд╕реНрд░реЛрдд рдХреЛрдб рдХреЗ рдЕрдиреБрд╕рд╛рд░, рднрд╡рд┐рд╖реНрдп рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдмрд┐рдЦрд░реА рд╣реБрдИ рд╕рдорд╛рдкреНрддрд┐рдПрдВ рд╣реИрдВ, рдЬреИрд╕реЗ рдХрд┐ рд░рд┐рдореЛрдЯрд╕реНрд╡рд╛рдЗрдирдЗрдиреНрдлреЛ рдФрд░ рдЕрдиреНрдп, рдЬреЛ рд╕рд╛рдордЧреНрд░реА рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рддреЗ рд╕рдордп рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИредрд╕реЛрд░реНрд╕ рдХреЛрдб рдЬреАрдердм рдкрд░ рдЙрдкрд▓рдмреНрдз рд╣реИ ред рдЗрд╕рдореЗрдВ рдиреНрдпреВрдирддрдо рдмрд┐рд▓реНрдб рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╣реИред рдпрд╣ рдЖрдкрдХреА рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдЙрджрд╛рд╣рд░рдг рдФрд░ рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреЗ рд╕реНрд░реЛрдд рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИредрдзреНрдпрд╛рди рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдк рд╕рднреА рдХрд╛ рдзрдиреНрдпрд╡рд╛рдж!