рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рдореИрдВ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ C ++ рдореЗрдВ рдЖрдк рд╕рдВрдХрд▓рди-рд╕рдордп рдбреЗрдЯрд╛ (рдкреНрд░рдХрд╛рд░) рдХреЛ рд░рди-рдЯрд╛рдЗрдо рдбреЗрдЯрд╛ (рдкреВрд░реНрдгрд╛рдВрдХ рдорд╛рди) рдореЗрдВ рдХреИрд╕реЗ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд ред
рдПрдХ рдЙрджрд╛рд╣рд░рдг:
int nType = ... ;
рдЕрдЧрд░ ( рдмрдврд╝рд╛рд╡рд╛ :: is_base_of < ISettable, / * ... рдЬрд╛рджреБрдИ рд░реВрдк рд╕реЗ nType рджреНрд╡рд╛рд░рд╛ рдЫрд┐рдкрд╛ рд╣реБрдЖ рдкреНрд░рдХрд╛рд░ рдпрд╣рд╛рдБ рд╣рд▓ рдХрд░реЗрдВ ... * / > :: рдореВрд▓реНрдп )
{
// рдХреБрдЫ рдХрд░реЛ
}
рдЕрдиреНрдпрдерд╛
{
// рдХреБрдЫ рдФрд░ рдХрд░реЛ
}
рдпрд╣ рдкреВрд░рд╛ рд╡рд┐рд╖рдп рдпрд╣ рд╕рдордЭрдиреЗ рдХреЗ рдЙрджреНрджреЗрд╢реНрдп рд╕реЗ рд╣реИ рдХрд┐ "nType рджреНрд╡рд╛рд░рд╛ рдпрд╣рд╛рдВ рдЫрд┐рдкреЗ рд╣реБрдП рдЬрд╛рджреБрдИ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рдорд╛рдзрд╛рди" рдХреЗ рдмрдЬрд╛рдп рдХреНрдпрд╛ рд▓рд┐рдЦрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдпрджрд┐ рдЖрдк рдХреЗрд╡рд▓ рдкрд░рд┐рдгрд╛рдо рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ, рддреЛ рдЕрдВрддрд┐рдо рдЕрдиреБрднрд╛рдЧ рдкрд░ рдЬрд╛рдПрдВред
рдереЛрдбрд╝рд╛ рдЗрддрд┐рд╣рд╛рд╕
рдпрд╣ рд╕рдм рдЗрд╕ рддрдереНрдп рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рд╣реБрдЖ рдХрд┐, рдбреНрдпреВрдЯреА рдкрд░, рдореБрдЭреЗ рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдПрдХ рдЬрдЯрд┐рд▓ рдХрд╛рд░рдЦрд╛рдиреЗ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереА, рдЬреЛ рд▓рдЧрднрдЧ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдХрд╛рдо рдХрд░рддрд╛ рдерд╛: рдПрдХ рд╡рд╕реНрддреБ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдмреБрд▓рд╛рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЬреЛ рдХрд┐ рдЧрддрд┐рд╢реАрд▓ рдбреЗрдЯрд╛ рдХреЗ рд░рд╕рд╛рддрд▓ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдмрдирд╛рдИ рдЧрдИ рд╡рд╕реНрддреБ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреА рдПрдХ рдЖрдИрдбреА рд▓реМрдЯрд╛рддрд╛ рд╣реИред рдпрд╣ рдЖрдИрдбреА рд╕реНрд╡рд┐рдЪ рдорд╛рдорд▓реЗ рдореЗрдВ рдЧрд┐рд░ рдЧрдИ, рдЬрд┐рд╕рдиреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рд╡рд╕реНрддреБ рдмрдирд╛рдИ, рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд╕реЗ:
int nObjectType = ResolveObjectType ( ... ) ;
рдмрдврд╝рд╛рд╡рд╛ рджреЗрдирд╛ :: share_ptr < IObject > pObject = CreateObject ( nObjectType ) ;
рдЗрд╕ рдкреНрд░рдгрд╛рд▓реА рдореЗрдВ рддрдм рддрдХ рд╕рдм рдХреБрдЫ рдареАрдХ рдерд╛ рдЬрдм рддрдХ рдХрд┐ рдпрд╣ рдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рд╣реЛ рдЬрд╛рддрд╛ рдХрд┐ рдХреБрдЫ рд░рдирдЯрд╛рдЗрдо рдкрд░рд┐рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ, рдлреЙрд░реНрдо рдХреЗ рд░реИрдкрд░ рдХреЛ рдХреБрдЫ рд╡рд╕реНрддреБрдУрдВ рдкрд░ рд▓рдЯрдХрд╛рдП рдЬрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
рдЯреЗрдореНрдкрд▓реЗрдЯ < рд╡рд░реНрдЧ TObject >
рд╡рд░реНрдЧ CFilter : рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ Tobject
{
рд╡рд░реНрдЪреБрдЕрд▓ рдмреВрд▓ рдлрд╝рд┐рд▓реНрдЯрд░рд╡реИрд▓реНрдпреВ ( ... ) { ... } ;
} ;
рдЗрд╕ рддрд░рд╣ рдХреЗ рд░реИрдкрд░ рдХреБрдЫ рд╢рд░реНрддреЛрдВ рдХреЗ рддрд╣рдд рдЖрд╡рд╢реНрдпрдХ рдирдИ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдореЗрдВ рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВред рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ, рд╢реБрд░реВ рдореЗрдВ рд░реИрдкрд░ рд▓рдЧрд╛рддрд╛рд░ рдФрд░ рдЕрдзрд┐рдХ рд╕реЗ рдХрдо рдФрд░ рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреА рд╡рд╕реНрддреБрдУрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдереЛрдбрд╝рд╛ рдХрдо рд▓рдЯрдХрд╛рдП рдЧрдП рдереЗ (рдЗрд╕рдХреЗ рд▓рд┐рдП рдХреЛрдб рдХреА рдХреБрдЫ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдирд╛ рдЖрд╡рд╢реНрдпрдХ рдерд╛, рдмрд╣реБрдд рд╕рд░рд▓)ред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЕрдирд╛рд╡рд╢реНрдпрдХ рдЖрд╡рд░рдг, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЙрдиреНрд╣реЛрдВрдиреЗ рдХрд╛рдо рдХреЗ рддрд░реНрдХ рдХреЛ рдиреБрдХрд╕рд╛рди рдирд╣реАрдВ рдкрд╣реБрдВрдЪрд╛рдпрд╛, рд▓реЗрдХрд┐рди рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдЖрдХрд╛рд░ рдореЗрдВ рд╡реГрджреНрдзрд┐ рдХреА, рдЬреЛ рдЕрд╕реНрд╡реАрдХрд╛рд░реНрдп рдерд╛: рджреЛрдиреЛрдВ рдХрд╛рд░рдЦрд╛рдиреЗ рдФрд░ рдЗрд╕рдХреА рдорджрдж рд╕реЗ рдмрдирд╛рдИ рдЧрдИ рд╡рд╕реНрддреБрдПрдВ рдкреНрд░рджрд░реНрд╢рди рдФрд░ рд╕реНрдореГрддрд┐ рдХреА рдЦрдкрдд рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдереАрдВред
рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд░реИрдкрд░ рдХреЛ рд╡реИрдХрд▓реНрдкрд┐рдХ рд░реВрдк рд╕реЗ рд╢рд╛рдорд┐рд▓ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рдерд╛ред рд╕рдорд╕реНрдпрд╛рдПрдБ рддреБрд░рдВрдд рдЙрддреНрдкрдиреНрди рд╣реБрдИ:
- рдПрдХ рдПрдХрд▓ рдЖрд╡рд░рдг рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд рдХреЗ рд╕рд╛рде, рдирд┐рд░реНрдорд┐рдд рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреА рд╕рдВрдЦреНрдпрд╛ рд▓рдЧрднрдЧ 2 рдЧреБрдирд╛ рдмрдврд╝ рдЧрдИ, рдХреНрдпреЛрдВрдХрд┐ рдЖрд╡рд░рдг рдПрдХ рдкреНрд░рдХрд╛рд░ рдкрд░ рд▓рд╛рдЧреВ рдирд╣реАрдВ рд╣реЛрддрд╛, рд▓реЗрдХрд┐рди рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕реЗрдЯ рдкрд░ред
- рдЗрди рдирдП рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдЬреЛрдбрд╝рддреЗ рд╕рдордп, рдореБрдЭреЗ рдкреВрд░реЗ рдХреЛрдб рдХреЗ рд╕рднреА рд╕реНрд╡рд┐рдЪ рдорд╛рдорд▓реЛрдВ рдХреА рддрд▓рд╛рд╢ рдХрд░рдиреА рдереА
(рдЖрдЦрд┐рд░рдХрд╛рд░, рдпрджрд┐ рдХреЛрдИ рдХреЛрдб рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреА рд╡рд╕реНрддреБ рдкрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХрд░рддрд╛ рдерд╛, рддреЛ рдЙрд╕реЗ рдЕрднреА рднреА CFilter <A> рдХрд╛ рдЬрд╡рд╛рдм рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдП, рдХреНрдпреЛрдВрдХрд┐ рдкреНрд░рдХрд╛рд░ рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдирд╣реАрдВ рд╣реБрдЖ рд╣реИ, рдмрд╕ рдирдИ рд╕реБрд╡рд┐рдзрд╛рдПрдБ рдЬреЛрдбрд╝реА рдЧрдИ рд╣реИрдВ)ред
- GetObjectType (...) рджреНрд╡рд╛рд░рд╛ рд▓реМрдЯрд╛рдП рдЧрдП рдореВрд▓реНрдп рд╕реЗ, рдореВрд▓ рдкреНрд░рдХрд╛рд░ (рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рд▓рд┐рдЦрд┐рдд рд╕реНрд╡рд┐рдЪ рдХреЗ рдмрд┐рдирд╛) рдХреЛ рдкреБрдирд░реНрд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд╕рдВрднрд╡ рдерд╛, рдЬрд┐рд╕рдиреЗ рдЕрдореВрд░реНрдд рдХреЛрдб рдХреЛ рд▓рд┐рдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреА, рдЬреЛ рдХрд┐ рд╡рд╕реНрддреБ, рдорд╛рдиреЛ, рдХреБрдЫ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХреБрдЫ рд╢рд░реНрддреЛрдВ рдХреЗ рддрд╣рдд, рд╕реАрдлрд┐рд▓реНрдЯрд░ рд░реИрдкрд░ рдХреЛ ISETable рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓реА рд╕рднреА рд╡рд╕реНрддреБрдУрдВ рдкрд░ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
- рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдмрдирд╛рдИ рдЧрдИ рд╡рд╕реНрддреБрдПрдБ рдбрд╛рдпрдиреЗрдорд┐рдХ_рдХрд╛рд╕реНрдЯ (рдмрд╣реБрдд рдзреАрдореА) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдмрд┐рдирд╛ рдЖрдорддреМрд░ рдкрд░ рдЙрдирдХреЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкреНрд░рдХрд╛рд░ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддреА рдереАрдВред
int nType = ... ;
рдЕрдЧрд░ ( рдмрдврд╝рд╛рд╡рд╛ :: is_base_of < ISettable, / * ... рдЬрд╛рджреБрдИ рд░реВрдк рд╕реЗ nType рджреНрд╡рд╛рд░рд╛ рдЫрд┐рдкрд╛ рд╣реБрдЖ рдкреНрд░рдХрд╛рд░ рдпрд╣рд╛рдБ рд╣рд▓ рдХрд░реЗрдВ ... * / > :: рдореВрд▓реНрдп )
{
// рдХреБрдЫ рдХрд░реЛ
}
рдЕрдиреНрдпрдерд╛
{
// рдХреБрдЫ рдФрд░ рдХрд░реЛ
}
рдореЗрд░рд╛ рдкрд╣рд▓рд╛ рд╡рд┐рдЪрд╛рд░: "рдпрд╣ рдЕрд╕рдВрднрд╡ рд╣реИ!"
рд╕рд╛рдБрдЪрд╛ рдЬрд╛рджреВ, рдпрд╛ рдЕрд╕рдВрднрд╡ рд╕рдВрднрд╡ рд╣реИ!
рдереЛрдбрд╝рд╛ рдФрд░ рд╕реЛрдЪрдиреЗ рдХреЗ рдмрд╛рдж, рдореИрдВ рдЗрд╕ рдирд┐рд╖реНрдХрд░реНрд╖ рдкрд░ рдкрд╣реБрдВрдЪрд╛ рдХрд┐ рдЖрдкрдХреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рджреЛ рдХрд╛рд░реНрдп рд▓рд┐рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
//! Tobject рдХреЗ рд▓рд┐рдП рдСрдмреНрдЬреЗрдХреНрдЯ рдСрдмреНрдЬреЗрдХреНрдЯ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рд╕рдВрд╡рд╛рджрджрд╛рддрд╛ рд▓реМрдЯрд╛рддрд╛ рд╣реИред
рдЯреЗрдореНрдкрд▓реЗрдЯ < рд╡рд░реНрдЧ TObject >
рдЗрдирд▓рд╛рдЗрди рдЗрдВрдЯ рдореЗрдХрдбрд╕реНрдХреНрд░рд┐рдкреНрдЯ ( ) ;
//! рдХреЙрд▓ ncptr рдХреЗ рд╕рд╛рде rcFunctor nTypeDescriptor рджреНрд╡рд╛рд░рд╛ рдЫрд┐рдкрд╛рдП рдЧрдП рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдПред
рдЯреЗрдореНрдкрд▓реЗрдЯ < рд╡рд░реНрдЧ TFunctor >
рдЗрдирд▓рд╛рдЗрди рдЯрд╛рдЗрдкрдиреЗрдо рдХрд╛ рдирд╛рдо Impl :: ResolveReturnType < TFunctor > :: рдкреНрд░рдХрд╛рд░ CallWithType ( const TFunctor & rcFunctor, int nTypeDescriptor ) ;
рд╕рдм рдХреБрдЫ рдпрд╣рд╛рдБ рд╕реНрдкрд╖реНрдЯ рд╣реИ:
- рдкрд╣рд▓рд╛ рдлрд╝рдВрдХреНрд╢рди рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдкреНрд░рдХрд╛рд░ (рдЯреЗрдореНрдкрд▓реЗрдЯ рдкреИрд░рд╛рдореАрдЯрд░) рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдЯрд╛рдЗрдк рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ (рд╕рдВрдЦреНрдпрд╛) рджреЗрддрд╛ рд╣реИред
- рджреВрд╕рд░рд╛ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдХрд┐рдП рдЧрдП рдлрд╝рдВрдХреНрдЯрд░ рдХреЛ рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рдирдВрдмрд░ nTypeDescriptor рдХреЗ рдЕрдВрджрд░ рдПрдиреНрдХреЛрдб рдХрд┐рдП рдЧрдП рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реВрдЪрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдлрд╝рдВрдХреНрдЯрд░ рдореЗрдВ рдЯреЗрдореНрдкрд▓реЗрдЯ рдСрдкрд░реЗрдЯрд░ () рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдЖрдк рдореВрд▓ рдкреНрд░рдХрд╛рд░ рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдкреБрдирд░реНрд╕реНрдерд╛рдкрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдЯреЗрдореНрдкрд▓реЗрдЯ < рд╡рд░реНрдЧ TKind >
рд╕рдВрд░рдЪрдирд╛ IsKindOfHelper
{
рдЯрд╛рдЗрдкреНрдбрд┐рдл рдмреВрд▓
рдЖрд░ ;
рдЗрдирд▓рд╛рдЗрди рдмреВрд▓ рдСрдкрд░реЗрдЯрд░ ( ) ( ... ) рдХрд╛рдВрд╕реНрдЯреЗрдмрд▓
{
рдЭреВрдареЗ рд▓реМрдЯрдирд╛ ;
}
рдЗрдирд▓рд╛рдЗрди рдмреВрд▓ рдСрдкрд░реЗрдЯрд░ ( ) ( рдЯреАрдХреЗрдЗрдВрдб * ) рдХрд╛рд╕реНрдЯ
{
рд╕рдЪ рд▓реМрдЯрдирд╛ ;
}
} ;
рдЯреЗрдореНрдкрд▓реЗрдЯ < рд╡рд░реНрдЧ TObject >
рдЗрдирд▓рд╛рдЗрди рдмреВрд▓ IsKindOf ( int nTypeDescriptor )
{
рд╡рд╛рдкрд╕реА CallWithType ( IsKindOfHelper < TObject > ( ) , nTypeDescriptor ) ;
}
...
int nType = ... ;
рдЕрдЧрд░ ( IsKindOf < ISettable > ( nType ) )
{
// рдХреБрдЫ рдХрд░реЛ
}
рдЕрдиреНрдпрдерд╛
{
// рдХреБрдЫ рдФрд░ рдХрд░реЛ
}
рд╕реВрдЪреА рдФрд░ рд╡рд┐рд╡рд░рдг рд▓рд┐рдЦреЗрдВред
рддреЛ, рдЪрд▓реЛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рдиреАрдЪреЗ рдЙрддрд░реЗрдВред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдореЗрдВ рдХреБрдЫ рд╕рдВрдХрд▓рди рд╕рдордп рд╕рд╛рд░рдгреА рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬреЛ рдХрд┐ рдкреНрд░рдХрд╛рд░ рдФрд░ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╡рд┐рд╡рд░рдгрдХрд░реНрддрд╛рдУрдВ рд╕реЗ рдореЗрд▓ рдЦрд╛рдПрдЧреАред рдпрд╣рд╛рдВ рд╕рдмрд╕реЗ рд╕рд░рд▓ рд╡рд┐рдХрд▓реНрдк рд▓реЛрдХреА :: рдЯрд╛рдЗрдкрд┐рд╕реНрдЯ рд╣реИ, рдпрд╣ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдлреЙрд░реНрдо рдХреА рдПрдХ рд╕рдВрд░рдЪрдирд╛ рд╣реИ:
рдЯреЗрдореНрдкрд▓реЗрдЯ < рд╡рд░реНрдЧ рдЯреА, рдХрдХреНрд╖рд╛ рдпреВ >
рд╕рдВрд░рдЪрдирд╛ рдЯрд╛рдЗрдкрд┐рд╕реНрдЯ
{
рдЯрд╛рдЗрдореНрдбрд┐рдл рдЯреА рд╣реЗрдб ;
рдЯрд╛рдЗрдкреНрдбрд┐рдлрд╝ рдпреВ рдЯреЗрд▓ ;
} ;
рдПрдХ рд╕рдордп рдореЗрдВ рдЗрд╕ рд╕рдВрд░рдЪрдирд╛ рдХреЗ рдЪрд┐рдВрддрди рдиреЗ рдореЗрд░реЗ рджрд┐рдорд╛рдЧ рдХреЛ C ++ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкреВрд░реА рддрд░рд╣ рдЙрд▓рдЯ рджрд┐рдпрд╛ред рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реИред рд╕рдм рдХреБрдЫ рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИ: рдЗрд╕рдХреА рд╕рд╣рд╛рдпрддрд╛ рд╕реЗ рдордирдорд╛рдиреА рд▓рдВрдмрд╛рдИ рдХреЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреА рд╕реВрдЪреА рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХреА рдЬрд╛рддреА рд╣реИ:
рдЯрд╛рдЗрдкрд┐рдбрд┐рдл рд▓реЛрдХреА :: рдЯрд╛рдЗрдкрд┐рд╕реНрдЯ < int , рд▓реЛрдХреА :: рдЯрд╛рдЗрдкрд┐рд╕реНрдЯ < рдЪрд╛рд░ , рд▓реЛрдХреА :: рдЯрд╛рдЗрдкрд┐рд╕реНрдЯ < рд╢реВрдиреНрдп , рд▓реЛрдХреА :: NullType >>>
TMyList ;
рдпрд╣рд╛рдВ рддреАрди рддрддреНрд╡реЛрдВ рдХреЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХреА рдЧрдИ рд╣реИ: рдЗрдВрдЯ, рдЪрд╛рд░, рд╢реВрдиреНрдпред рд▓реЛрдХреА :: NullType рдХрд╛ рдЕрд░реНрде рд╕реВрдЪреА рдХрд╛ рдЕрдВрдд рд╣реИред рдЗрд╕ рд╕реВрдЪреА рд╕реЗ рд╡рд┐рд╢реЗрд╖ рд░реВрдкрд╛рдВрдХрдиреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рдЖрдк рд╕реВрдЪрдХрд╛рдВрдХ рдХреЗ рдкреНрд░рдХрд╛рд░ рдФрд░ рдкреНрд░рдХрд╛рд░ рдирд┐рдХрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВ:
// int MyInt;
рд▓реЛрдХреА :: TypeAt < TMyList, 0 > :: рдкрд░рд┐рдгрд╛рдо MyInt ;
// рдЪрд╛рд░ MyChar;
рд▓реЛрдХреА :: TypeAt < TMyList, 1 > :: рдкрд░рд┐рдгрд╛рдо MyChar ;
int nIndexOfChar = Loki :: IndexOf < TMyList, char > :: value ;
рдЗрди рд╕рднреА рд░реВрдкрдХреЛрдВ рдХреЛ рд╕рдВрдХрд▓рди рдЪрд░рдг рдореЗрдВ "рдКрдкрд░" рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рд╕рдордп рдУрд╡рд░рд╣реЗрдб рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИред рд▓реЛрдХреА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рд╡рд┐рдХрд┐рдкреАрдбрд┐рдпрд╛ рдкрд░ рдкрд╛рдИ рдЬрд╛ рд╕рдХрддреА рд╣реИ, рдЗрд╕рдореЗрдВ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╕реНрд░реЛрддреЛрдВ рдХрд╛ рд▓рд┐рдВрдХ рднреА рд╣реИред "рдореЙрдбрд░реНрди рдбрд┐рдЬрд╝рд╛рдЗрди рдЗрди рд╕реА ++" (рдЕрд▓реЗрдХреНрдЬреЗрдВрдбреНрд░реЗрд╕реНрдХреБ) рдкреБрд╕реНрддрдХ рдореЗрдВ рдЖрдк рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рд╕рдм рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред
рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ, рдореИрдВрдиреЗ рдмреВрд╕реНрдЯ рдПрдордкреАрдПрд▓ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ред рдпрд╣ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдХреА рд╕рдВрднрд╛рд╡рдирд╛рдПрдВ рдЕрдзрд┐рдХ рд╡реНрдпрд╛рдкрдХ рд╣реИрдВред рдкреНрд░рдпреЛрдЧреЛрдВ рд╕реЗ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ рд╕рдВрдХрд▓рдХ рд▓рдЧрднрдЧ 2000 рдкреНрд░рдХрд╛рд░ рдХреА рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдЫреЛрдбрд╝ рджреЗрддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдмрд╛рдж рдирд┐рдореНрди рдЪрд┐рддреНрд░ рджреЗрдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ:
рдЯрд╛рдЗрдк рд╕реВрдЪрд┐рдпреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдХ рдкреИрдЯрд░реНрди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ред
рд╡рд┐рдЪрд╛рд░:
рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдкреНрд░рдХрд╛рд░ рдХреА рд╕реВрдЪреА рдореЗрдВ рд╕рднреА рдЬреНрдЮрд╛рдд рдСрдмреНрдЬреЗрдХреНрдЯ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рд╕реВрдЪреАрдмрджреНрдз рдХрд░реЗрдВред рдлрд┐рд░, рдПрдХ рд╡рд┐рд╢реЗрд╖ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЗрдВрдбреЗрдХреНрд╕ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдЯрд╛рдЗрдк рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рдХреЛ рдЬрд╛рдирдиреЗ рдХреЗ рдмрд╛рдж, рдЖрдк рдЗрд╕реЗ рд╕реВрдЪреА рдореЗрдВ рджреЗрдЦрдХрд░ рд╕реНрд╡рдпрдВ рд╣реА рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдПрдХрдорд╛рддреНрд░ рд╕рдорд╕реНрдпрд╛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╣реИ: рд╕реВрдЪрдХрд╛рдВрдХ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЕрдиреБрдорд╛рди рдХреЗ рд▓рд┐рдП, рд╕реВрдЪрдХрд╛рдВрдХ рдХреЛ рдПрдХ рд╕реНрдерд┐рд░ (рд╕рдВрдХрд▓рди-рд╕рдордп рдорд╛рди) рдХреЗ рд░реВрдк рдореЗрдВ рджрд░реНрд╢рд╛рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЕрд░реНрдерд╛рддред рд╣рдореЗрдВ рдпрд╣ рдЬрд╛рдирдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рдЪрд░ рдХреЗ рдорд╛рдиреЛрдВ рдХреЛ рдЙрдирдХреЗ рд╕рдВрдмрдВрдзрд┐рдд рдкреНрд░рдХрд╛рд░ mpl :: int_ <# value #> рдореЗрдВ рдХреИрд╕реЗ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПред
рдирд╛рдо рд╕реНрдерд╛рди рдХреЛ рдмрдврд╝рд╛рд╡рд╛ рджреЗрдиреЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ ;
рдирд╛рдорд╕реНрдерд╛рди Impl
{
//! рдЬреНрдЮрд╛рдд рд╡рд╕реНрддреБ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреА рдПрдХ рд╕реВрдЪреАред
/ ** рд╡рд╛рд╕реНрддрд╡рд┐рдХ рджреБрдирд┐рдпрд╛ рдореЗрдВ рдпрд╣ рд╕рдВрд░рдЪрдирд╛ рдЯреЗрдореНрдкрд▓реЗрдЯреНрд╕ рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдорд┐рдд рд╣реИред * /
typedef mpl :: рд╕реВрдЪреА < TObjectType1, TObjectType2, TObjectType3 >
TKnownObjectTypes ;
//! рдЬреНрдЮрд╛рдд рд╡рд╕реНрддреБ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреА рдЧрдгрдирд╛ред
typedef mpl :: рдЖрдХрд╛рд░ < TKnownAtomTypes > :: рдкреНрд░рдХрд╛рд░
TKnownObjectTypesCount ;
}
рдирд╛рдорд╕реНрдерд╛рди Impl
{
//! рдпрд╣ рдореЗрдЯрд╛рдлрд╝рдВрдХреНрд╢рди TKnownObjects рд╕реЗ TObject рдХрд╛ рдПрдХ рд╕реВрдЪрдХрд╛рдВрдХ рджреЗрддрд╛ рд╣реИред
/ ** рдЕрдЧрд░ рдЯреЛрдмреЗрдХреНрдЯ TKnownObjects рдореЗрдВ рдЕрдиреБрдкрд╕реНрдерд┐рдд рд╣реИ, рддреЛ рд░рд┐рдЯрд░реНрди -1 * /
рдЯреЗрдореНрдкрд▓реЗрдЯ < рд╡рд░реНрдЧ TObject >
рд╕рдВрд░рдЪрдирд╛ MakeDescriptorImpl
: / * рдпрджрд┐ * / mpl :: eval_if <
/ * рдЦреЛрдЬреЗрдВ (TOBject) == рдЕрдВрдд * /
is_same <
рдЯрд╛рдЗрдкрдиреЗрдо mpl :: рдЦреЛрдЬреЗрдВ < TKnownObjectTypes, Tobject > :: рдкреНрд░рдХрд╛рд░ ,
mpl :: end < TKnownObjectTypes > :: рдкреНрд░рдХрд╛рд░ > ,
/ * рдлрд┐рд░ рд╡рд╛рдкрд╕реА -1 * /
mpl :: рдкрд╣рдЪрд╛рди < mpl :: int_ < - 1 >> ,
/ * рдФрд░ рд╡рд╛рдкрд╕реА рджреВрд░реА (рд╢реБрд░реВ, рдЦреЛрдЬреЗрдВ (TOBject)) * /
mpl :: рд▓рд╛рдЧреВ рдХрд░реЗрдВ <
mpl :: рджреВрд░реА <
mpl :: start < TKnownObjectTypes > :: рдкреНрд░рдХрд╛рд░ ,
mpl :: рдЦреЛрдЬреЗрдВ < TKnownObjectTypes, _ >> ,
Tobject >> :: рдкреНрд░рдХрд╛рд░
{
} ;
//! TFunctor рдХреЛ TobjectType рдХреЗ рд╕рд╛рде рдХреЙрд▓ рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИ *
рдЯреЗрдореНрдкрд▓реЗрдЯ < рд╡рд░реНрдЧ TFunctor >
рд╕рдВрд░рдЪрдирд╛ CallWithObjectTypeHelperPointerBased
{
рдЬрдирддрд╛ :
// typename ResolveReturnType <TFunctor> :: рдЯрд╛рдЗрдк рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП TFunctor :: R if
// TFunctor :: R typedef рдореМрдЬреВрдж рд╣реИ, рдЕрдиреНрдпрдерд╛, рдпрд╣ рдЦрд╛рд▓реА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рдХрд╕рд┐рдд рд╣реЛрддрд╛ рд╣реИред
typedef typename ResolveReturnType < TFunctor > :: рдкреНрд░рдХрд╛рд░
рдЖрд░ ;
рд╕рдВрд░рдХреНрд╖рд┐рдд :
рдХрд╛рд╕реНрдЯ TFunctor рдФрд░
m_rcFunctor ;
рдЬрдирддрд╛ :
CallWithObjectTypeHelperPointerBased ( const TFunctor & rcFunctor )
: m_rcFunctor ( rcFunctor )
{
}
//! рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЛ CallWithInt (...) рджреНрд╡рд╛рд░рд╛ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред
рдЯреЗрдореНрдкрд▓реЗрдЯ < рд╡рд░реНрдЧ TIndex >
рдЖрд░ рдСрдкрд░реЗрдЯрд░ ( ) ( TIndex ) рдХрд╛рдВрд╕реНрдЯреЗрдмрд▓
{
// рдЗрдВрдбреЗрдХреНрд╕ рджреНрд╡рд╛рд░рд╛ рдСрдмреНрдЬреЗрдХреНрдЯ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдПрдВ
typedef typename mpl :: рдкрд░ < TKnownObjectTypes, TIndex > :: рдкреНрд░рдХрд╛рд░
Tobject ;
// рдкреЙрдЗрдВрдЯрд░ рдХреЛ рдкреЙрдЗрдВрдЯрд░ рдХреЗ рд╕рд╛рде рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП
рд╡рд╛рдкрд╕реА m_rcFunctor ( ( TObject * ) NULL ) ;
}
//! рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЛ CallWithInt (...) рджреНрд╡рд╛рд░рд╛ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред
рдЖрд░ рдСрдкрд░реЗрдЯрд░ ( ) ( mpl :: void_ ) рдХрд╛рд╕реНрдЯ
{
// рд╡рд┐рд╡рд░рдгрдХ рдЯреВрдЯ рдЧрдпрд╛ рд╣реИ, рд╡рд┐рд╢реЗрд╖ рдореВрд▓реНрдп рдХреЗ рд╕рд╛рде рдХреЙрд▓ рдлрд╝рдирдХрд╛рд░
рд╡рд╛рдкрд╕реА m_rcFunctor ( mpl :: void_ ( ) ) ;
}
} ;
}
//! рд░рд┐рдЯрд░реНрди рдЯреВ рдСрдмреНрдЬреЗрдХреНрдЯ рдЯрд╛рдЗрдк рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рд╕рдВрд╡рд╛рджрджрд╛рддрд╛ рдЯреВрдмрдЬреЗрдХреНрдЯред
рдЯреЗрдореНрдкрд▓реЗрдЯ < рд╡рд░реНрдЧ TObject >
рдЗрдирд▓рд╛рдЗрди рдЗрдВрдЯ рдореЗрдХрдбрд╕реНрдХреНрд░рд┐рдкреНрдЯ ( )
{
// рдЕрдЬреНрдЮрд╛рдд рд╡рд╕реНрддреБ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдСрдмреНрдЬреЗрдХреНрдЯ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╡рд┐рд╡рд░рдг рдмрдирд╛рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕!
BOOST_STATIC_ASSERT ( Impl :: MakeDescriptorImpl < Tobject > :: value ! = - 1 ) ;
// рд░рд┐рдЯрд░реНрди рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░, рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рдВрдХрд▓рд┐рдд рд╕рдордп рд▓рдЧрд╛рддрд╛рд░ рдЙрддреНрдкрдиреНрди рд╣реЛрддрд╛ рд╣реИред
рд╡рд╛рдкрд╕реА Impl :: MakeDescriptorImpl < TObject > :: рдореВрд▓реНрдп ;
}
//! TOBject рдХреЗ рд╕рд╛рде rcFunctor рдХреЙрд▓ рдХрд░реЗрдВ * nObjectTypeDescriptor рдХреЗ рд╕рдВрд╡рд╛рджрджрд╛рддрд╛ред
рдЯреЗрдореНрдкрд▓реЗрдЯ < рд╡рд░реНрдЧ TFunctor >
рдЗрдирд▓рд╛рдЗрди рдЯрд╛рдЗрдкрдиреЗрдо рдХрд╛ рдирд╛рдо Impl :: ResolveReturnType < TFunctor > :: рдкреНрд░рдХрд╛рд░ CallWithType ( const TFunctor & rcFunctor, int nObjectTypeDescriptor )
{
// int рдХреЗ рд╕рд╛рде рдХреЙрд▓ рдХрд░реЗрдЧрд╛
// Impl :: CallWithObjectTypeHelperPointerBased <TFunctor> (rcFunctor)
// functor with mpl :: int_ <N> () рддрд░реНрдХ, рдЬрд╣рд╛рдВ N рд╕рдВрдХрд▓рди рд╕рдордп рд╕реНрдерд┐рд░ рд╣реИ
// nObjectTypeDescriptor рдХреЗ рдорд╛рди рдХреЗ рдЕрдиреБрд░реВрдкред
// рдЕрдЧрд░ nObjectTypeDescriptor <0 || nObjectTypeDescriptor> = TKnownObjectTypesCount
// functor рдХреЛ mpl :: void_ () рдХреЗ рд╕рд╛рде рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдпрд╣ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ рдХрд┐ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╡рд┐рд╡рд░рдг рдЯреВрдЯ рдЧрдпрд╛ рд╣реИред
рд╡рд╛рдкрд╕реА Impl :: CallWithInt < mpl :: int_ < 0 > , TKnownObjectTypesCount (-
Impl :: CallWithObjectTypeHelperPointerBased < TFunctor > ( rcFunctor ) ,
nObjectTypeDescriptor ) ;
}
рдореИрдВрдиреЗ рдкреВрд░реЗ рдХреЛрдб рдкрд░ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдЯрд┐рдкреНрдкрдгреА рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдЕрднреА рднреА рдХрд╛рдлреА рдЬрдЯрд┐рд▓ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдХреБрдЫ рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдВ рд╣реИрдВ:
1ред
typename ResolveReturnType :: рдЯрд╛рдЗрдк рдХреЛ рдХрдВрдкрд╛рдЗрд▓рд░ рджреНрд╡рд╛рд░рд╛ TFunctor :: R. рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдордЭрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрджрд┐ TFunctor :: R рдПрдХ рдЕрдорд╛рдиреНрдп рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдкреНрд░рдХрд╛рд░ R рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ TFunctor рдореЗрдВ рдирд╣реАрдВ рд╣реИ), рддреЛ ResolveReturnType :: рдкреНрд░рдХрд╛рд░ рдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рд╢реВрдиреНрдп рдХреЗ рд░реВрдк рдореЗрдВ рдХреА рдЬрд╛рддреА рд╣реИред рд╣рд╛рдБ рдпрд╣ рд╕рдВрднрд╡ рд╣реИред рдирд╣реАрдВ, рдореИрдВ рдЭреВрда рдирд╣реАрдВ рдмреЛрд▓ рд░рд╣рд╛ рд╣реВрдБ ред рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдиреАрдЪреЗ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬреЛ рд▓рд┐рдВрдХ рдХреЙрд▓рд╡рд┐рдердЖрдИрдВрдЯ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИред
2ред
MakeDescriptorImpl рд╕рдХреНрд░рд┐рдп рд░реВрдк рд╕реЗ рдмрдврд╝рд╛рд╡рд╛ рджреЗрдиреЗ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ :: mpl рдФрд░ рднрдпрднреАрдд рджрд┐рдЦрддрд╛ рд╣реИред рд╕реНрдкрд╖реНрдЯрддрд╛ рдХреЗ рд▓рд┐рдП, рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ stl рдореЗрдВ рд╕рдорд╛рди рднрд╛рд╡ рд╣реЛрддреЗ рд╣реИрдВ (рдЬреЛ, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рд╕рдВрдХрд▓рди рдЪрд░рдг рдкрд░ рд▓рд╛рдЧреВ рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВ)ред рд╕реНрдХреАрдо рд╕реЗ рдЗрдВрдбреЗрдВрдЯреЗрд╢рди рд╕реНрдЯрд╛рдЗрд▓ рдлрдЯрд╛ рд╣реБрдЖ рд╣реИ ред рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЬреЛ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛рдУрдВ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реИрдВ, рдЖрдкрдХреЛ рдмрд╕ рдпрд╣ рд╕рдордЭрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ C ++ рдореЗрдВ рдореЗрдЯрд╛рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ (рдЯреЗрдореНрдкрд▓реЗрдЯ рдореИрдЬрд┐рдХ) рдПрдХ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рднрд╛рд╖рд╛ рд╣реИред
3ред
CallWithInt рд░рди-рдЯрд╛рдЗрдо рдкреВрд░реНрдгрд╛рдВрдХ рдорд╛рдиреЛрдВ рдХреЛ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдорд╛рдиреЛрдВ рдХреЗ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХреНрд╖реЗрддреНрд░ рд╕реЗ рд╕рдВрдХрд▓рди-рд╕рдордп рдкреВрд░реНрдгрд╛рдВрдХ рдорд╛рдиреЛрдВ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рддрд╛ рд╣реИред рд╣рдо рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдереЛрдбрд╝реА рджреЗрд░ рдмрд╛рдж рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд░реЗрдВрдЧреЗред
рдЙрджрд╛рд╣рд░рдг: 42 рдХреЛ mpl рдореЗрдВ рдХрдирд╡рд░реНрдЯ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ :: int_ <42>
4ред
рдпрджрд┐ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди mpl :: рд╕реВрдЪреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп, рдмрд╛рдЗрдирд░реА рдЯреНрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп рдЕрдзрд┐рдХ рдХреБрд╢рд▓ (рд╕рдВрдХрд▓рди рдЧрддрд┐ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ) рд╣реЛрдЧрд╛ред рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдореБрдЭреЗ рдРрд╕реА рд╕рдВрд░рдЪрдирд╛рдПрдВ рдирд╣реАрдВ рдорд┐рд▓реАрдВ, рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рдЦреБрдж рд▓рдВрдмреЗ рд╕рдордп рддрдХ рд▓рд┐рдЦрд╛ рдерд╛ред рд╣рдорд╛рд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд▓рд┐рдП, рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд╣реАрдВ рдерд╛, 500 рд╕реЗ рдХрдо рдкреНрд░рдХрд╛рд░реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд╕рд╛рде рдпрд╣ рдЙрд╕ рддрд░рд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред
5ред
рд░рдирдЯрд╛рдЗрдо рдкреНрд░рджрд░реНрд╢рди рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ, рдпрд╣ рдХреЛрдб рдмрд╣реБрдд рддреЗрдЬ рд╣реИред CallWithInt, рдЬреИрд╕рд╛ рдХрд┐ рд╣рдо рдиреАрдЪреЗ рджреЗрдЦреЗрдВрдЧреЗ, рдиреЗрд╕реНрдЯреЗрдб рд╕реНрд╡рд┐рдЪ рдорд╛рдорд▓реЛрдВ рдкрд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП, рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдПрдХ рдкреНрд░рдХрд╛рд░ рдореЗрдВ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдСрдлрд╕реЗрдЯ рдХреЗ рд╕рд╛рде рдХреЗрд╡рд▓ рдХреБрдЫ рдмрд┐рдирд╛ рд╢рд░реНрдд рдХреВрдж рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдЙрд▓рдЯрд╛ рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рд▓рд┐рдП, рдХреБрдЫ рднреА рдЬрд╝рд░реВрд░рдд рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ MakeDescriptor рдПрдХ рд╕реНрдерд┐рд░ рдореЗрдВ inlinesред
6ред
рд╡рд╛рд╕реНрддрд╡рд┐рдХ рджреБрдирд┐рдпрд╛ рдореЗрдВ, рдЬреНрдЮрд╛рдд рд╡рд╕реНрддреБрдУрдВ рдХреА рдПрдХ рд╕реВрдЪреА рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдЯреЗрдореНрдкрд▓реЗрдЯ рдЬрд╛рджреВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд▓рдЧрднрдЧ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рддрд░реАрдХреЗ рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
- рд╡рд╕реНрддреБрдУрдВ рдХреА рдПрдХ рдореВрд▓ рд╕реВрдЪреА рд╕реЗрдЯ рдХреА рдЬрд╛рддреА рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдЙрд╕реА рддрд░рд╣)
- рдпрджрд┐ рд╕рдВрднрд╡ рд╣реЛ рддреЛ рдкреНрд░рддреНрдпреЗрдХ рдЖрд╡рд░рдг рдкреНрд░рдХрд╛рд░ рдХреА рд╡рд░реНрддрдорд╛рди рд╕реВрдЪреА рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рдмрджрд▓реЗ рдореЗрдВ рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИред рд░реИрдкрд░ рдЦреБрдж рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рд╡рд╣ рдХрд┐рд╕реА рд╡рд┐рд╢реЗрд╖ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рдХреИрд╕реЗ рд╕рдВрд╡рд╛рдж рдХрд░реЗрдЧрд╛ред рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдкрд░рд┐рдгрд╛рдо (рдирдпрд╛ рдкреНрд░рдХрд╛рд░) рдХреЛ рд╡рд░реНрддрдорд╛рди рдкреНрд░рдХрд╛рд░ рд╕реВрдЪреА рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИред
7ред
рдЙрдкрд░реЛрдХреНрдд рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╡рд╛рд╕реНрддрд╡рд┐рдХ рджреБрдирд┐рдпрд╛ рдореЗрдВ рдЙрдирдХреЗ рдХрдИ рдФрд░ рд╡рд┐рдХрд▓реНрдк рд▓рд╛рдЧреВ рд╣реЛрддреЗ рд╣реИрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, MakeDescriptorNonStrict, рдЬреЛ -1 рд▓реМрдЯрд╛рддрд╛ рд╣реИ (рдФрд░ рд╣рдореЗрд╢рд╛ рдХреА рддрд░рд╣ рд╕рдВрдХрд▓рди рддреНрд░реБрдЯрд┐ рдирд╣реАрдВ рд╣реИ, рдпрджрд┐ рдпрд╣ рд╡рд┐рдЬреНрдЮрд╛рди рдХреЗ рд▓рд┐рдП рдЕрдЬреНрдЮрд╛рдд рдкреНрд░рдХрд╛рд░ рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИ)ред CallWithType рдХреЗ рдкрд╛рд╕ рдЕрдиреНрдп рд╡рд┐рдХрд▓реНрдк рднреА рд╣реИрдВ рдЬреЛ рдПрдХ рдлрд╝рдирдХрд╛рд░ рдХрд╣рддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рджреЛ рдкреЙрдЗрдВрдЯрд░реНрд╕ рдХреЗ рд╕рд╛рде (рдПрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЗрдирд╣реЗрд░рд┐рдЯреЗрдВрд╕ рдЯреНрд░реА рдХреЗ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рджреВрд╕рд░рд╛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкреНрд░рдХрд╛рд░ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП)ред
CallWithInt рд░рд┐рд▓реАрдЬрд╝
рдпрд╣ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдЕрдВрддрд┐рдо (рд╕рдмрд╕реЗ рдХрдард┐рди) рдХрджрдо рдЙрдард╛рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛ рд░рд╣рддрд╛ рд╣реИ: рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд▓рд┐рдЦреЗрдВ рдЬреЛ рдХрд┐ рдкреНрд░рдХрд╛рд░ mpl рдХреЗ рдПрдХ рдлрд╝рдВрдХреНрд╢рдирд▓ рдХреЛ рдмреБрд▓рд╛рдПрдЧрд╛ :: int_ <N> (), рдЬрд╣рд╛рдВ рдПрди рд░рди-рдЯрд╛рдЗрдо рдЪрд░ рдХреЗ рдЕрдВрджрд░ рд╕рдВрдЧреНрд░рд╣реАрдд рдореВрд▓реНрдп рд╕реЗ рдореЗрд▓ рдЦрд╛рддреА рд╣реИред рдпрд╣ рд╢рд╛рдпрдж рд╕рдмрд╕реЗ рдХрдард┐рди рд╣рд┐рд╕реНрд╕рд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╡рд╣ рд╣реИ рдЬреЛ рд░рдирдЯрд╛рдЗрдо рд╡реИрд▓реНрдпреВ рдХреЛ рдЯрд╛рдЗрдк рдореЗрдВ рдЯреНрд░рд╛рдВрд╕рд▓реЗрдЯ рдХрд░рддрд╛ рд╣реИред
рд╡рд┐рдЪрд╛рд░ рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИ:
рд╣рдо рд╕реНрд╡рд┐рдЪ рдХреЗ рд╕рд╛рде рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдмрдирд╛рддреЗ рд╣реИрдВ, рдПрдХ рд╕реМ рддрддреНрд╡реЛрдВ рдХрд╛ рдХрд╣рдирд╛ рд╣реИ, рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХрд┐рд╕реА рднреА рдлрд╝рдирдХрд╛рд░ рдХреЛ рд╡реИрд▓реНрдпреВ mpl :: int <N> рдХреЗ рд╕рд╛рде рдХреЙрд▓ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬрд╣рд╛рдВ рдПрди рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдкрд╛рд░рд┐рдд рдЪрд░ рдХреЗ рдореВрд▓реНрдп рд╕реЗ рдореЗрд▓ рдЦрд╛рддреА рд╣реИред рдпрджрд┐ рд╣рдореЗрдВ рдПрдХ рдФрд░ рдЕрдВрддрд░рд╛рд▓ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╣рдо рдмрд╕ рдЕрддрд┐рд░рд┐рдХреНрдд рдзреЛрдЦрд╛рдзрдбрд╝реА рдХрд░рддреЗ рд╣реИрдВ: рдСрдлрд╕реЗрдЯ рдФрд░ рдбрд┐рдмреНрдмреЗ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рддред рдЗрд╕рд▓рд┐рдП, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЕрдЧрд░ рд╣рдореЗрдВ рдХрд┐рд╕реА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдЕрдВрддрд░рд╛рд▓ 56 ... 156 рдореЗрдВ рдПрдХ рдкреНрд░рдХрд╛рд░ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЖрдкрдХреЛ рдмрд╕ рд╣рд░ рдмрд╛рд░ рдЙрд╕ рдЪрд░ рд╕реЗ рдШрдЯрд╛рдирд╛ рд╣реЛрдЧрд╛, рдЬреЛ рд╣рдореЗрдВ 56 рдореЗрдВ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдФрд░ рдлрд┐рд░, рдПрдХ рдкреНрд░рдХрд╛рд░ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, 56 рдЬреЛрдбрд╝реЗрдВ (рд▓реЗрдХрд┐рди рдкреНрд░рдХрд╛рд░!) рдЕрдЧрд░ рд╣рдореЗрдВ рдХрд┐рд╕реА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдЕрдВрддрд░рд╛рд▓ 200..400 рд╕реЗ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╣рдореЗрдВ рдкрд╣рд▓реЗ рдЗрд╕реЗ "100" рдЦрдВрдбреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдлрд┐рд░ рдЕрдиреБрднрд╛рдЧ рдХреА рд╕рдВрдЦреНрдпрд╛ рдФрд░ рдЕрдиреБрднрд╛рдЧ рдХреЗ рднреАрддрд░ рдСрдлрд╕реЗрдЯ рдХреА рдЧрдгрдирд╛ рдХрд░реЗрдВред
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ рдЗрд╕реЗ рдмреЗрд╡рдЬрд╣ рд╕рдордЭрд╛ рд░рд╣рд╛ рд╣реВрдВ, рдЗрд╕рд▓рд┐рдП рдпрд╣рд╛рдВ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╣рддреНрдпрд╛рд░рд╛ рдХреЛрдб рд╣реИ ред
рдЯрд┐рдкреНрдкрдгреА:
0ред
рдмрд╣реБрдд рд╕рд╛рд░реЗ рдордзреБрдордХреНрдЦреА :(
1ред
рд╡рд╛рд╕реНрддрд╡рд┐рдХ рджреБрдирд┐рдпрд╛ рдореЗрдВ, рд╕реНрд╡рд┐рдЪ рдореЗрдВ 100 рдорд╛рдорд▓реЗ рд╣реИрдВ (рдореВрд▓реНрдп рдХрд╛ рдкреНрд░рдпреЛрдЧрд╛рддреНрдордХ рд░реВрдк рд╕реЗ рдЪрдпрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдХреЛрдб рдХрд┐рд╕реА рднреА рдореВрд▓реНрдп рдХреЗ рд▓рд┐рдП рдкрд░рд┐рдЪрд╛рд▓рди рд╣реИ> = 2)ред
2ред
рд╡рд╛рд╕реНрддрд╡рд┐рдХ рджреБрдирд┐рдпрд╛ рдореЗрдВ, рдореИрдХреНрд░реЛ рджреНрд╡рд╛рд░рд╛ рд╕реНрд╡рд┐рдЪ рдорд╛рдорд▓реЗ рдЙрддреНрдкрдиреНрди рд╣реЛрддреЗ рд╣реИрдВред
3ред
рдпрд╣ рддреЗрдЬреА рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдмрд╣реБрдд рддреЗрдЬ рд╣реИред рдЖрдкрдХреЛ рдЗрд╕ рддрд░рд╣ рдХреЗ рдХреНрд░реВрд░ рднрд╛рд╡реЛрдВ рдХреЗ рд▓рд┐рдП рднреБрдЧрддрд╛рди рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рд╕рдВрдХрд▓рдХ рд╕реНрд╡рд┐рдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреВрдВрдЫ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдХ рд╕рд░рд▓ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдЕрдиреБрдХреВрд▓рди рдирд╣реАрдВ рдХрд░ рд╕рдХрд╛ :(
рдЖрд╡реЗрджрди
рдЕрдм рдЖрдк рдпрд╣ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
1. рдХрд┐рд╕реА рднреА рд╡рд╕реНрддреБ рдХреЛ рдмрдирд╛рдирд╛, рд╡рд╕реНрддреБ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рдЬреНрдЮрд╛рдд рдкреНрд░рдХрд╛рд░реЛрдВ рдХреА рд╕реВрдЪреА рдореЗрдВ рдЬреЛрдбрд╝рдирд╛ред рдкрд╣рд▓реЗ, рдЬрдм рдирдП рдкреНрд░рдХрд╛рд░ рдХреА рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рддреЛ рд╕рднреА рд╕реНрд╡рд┐рдЪ рдорд╛рдорд▓реЛрдВ рдХреЛ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдЦреЛрдЬрдирд╛ рдЖрд╡рд╢реНрдпрдХ рдерд╛, рдЕрдм рдХреЛрдИ рд╕реНрд╡рд┐рдЪ рдХреЗрд╕ рдирд╣реАрдВ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рд╕рднреА рдирдП рдкреНрд░рдХрд╛рд░ рдХреА рд╡рд╕реНрддреБрдУрдВ рдХреЛ "рдмреЙрдХреНрд╕ рд╕реЗ рдмрд╛рд╣рд░" рдХрд╛ рд╕рдорд░реНрдерди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рдЙрджрд╛рд╣рд░рдг рдПрдХ рд╕реНрд╡рд┐рдЪ рдХреЗрд╕ рдХреЗ рдЧрд╛рдпрдм рд╣реЛрдиреЗ рдХреЛ рджрд┐рдЦрд╛рддрд╛ рд╣реИред
рдпрд╣ рдерд╛:
int nObjectType = ResolveObjectType ( ... ) ;
рд╕реНрд╡рд┐рдЪ ( nObjectType )
{
рдХреЗрд╕ 1 :
рдирдпрд╛ tobject1 ( ) рд▓реМрдЯреЗрдВ ;
рдорд╛рдорд▓рд╛ 2 :
рдирдпрд╛ TObject2 рд▓реМрдЯрд╛рдПрдБ ( ) ;
рдХреЗрд╕ 3 :
рдирдИ TObject3 рд▓реМрдЯреЗрдВ ( ) ;
рдорд╛рдорд▓рд╛ 4 :
рдирдпрд╛ TObject4 ( ) рд▓реМрдЯреЗрдВ ;
/ * ... 100+ рдЕрдзрд┐рдХ рдорд╛рдорд▓реЗ рдпрд╣рд╛рдБ рдЬрд╛рддреЗ рд╣реИрдВ * /
рдбрд┐рдлрд╝реЙрд▓реНрдЯ :
рд╡рд╛рдкрд╕реА NULL ;
} ;
рдпрд╣ рдмрди рдЧрдпрд╛:
//! рдпрд╣ рдЖрд╡рд░рдг рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╡рд╕реНрддреБ рдкреНрд░рдХрд╛рд░ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред
рдЯреЗрдореНрдкрд▓реЗрдЯ < рд╡рд░реНрдЧ TBase, рд╡рд░реНрдЧ Tobject = TBase >
рд╕рдВрд░рдЪрдирд╛ CTypeWrapper
: рдкрдмреНрд▓рд┐рдХ рдЯреАрдмреАрдЬрд╝
{
//! рд░рд┐рдЯрд░реНрди рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рд╕рдВрд╡рд╛рджрджрд╛рддрд╛ рдЯрд╛рдЗрдк рдХрд░реЗрдВред
рд╡рд░реНрдЪреБрдЕрд▓ рдЗрдВрдЯ рдЯрд╛рдЗрдкрд╕реАрд╕реНрдХреНрд░рд┐рдкреНрдЯ ( ) рдХрд╛рдВрд╕реНрдЯреЗрдмрд▓
{
рд╡рд╛рдкрд╕реА MakeDescriptor < Tobject > ( ) ;
}
} ;
//! рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдмрдирд╛рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИред рджрд░рдЕрд╕рд▓ рдпрд╣ рдлрдирдХрд╛рд░ рд╣реИ, рдЬрд┐рд╕реЗ рдСрдмреНрдЬреЗрдХреНрдЯ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рд╡рд░реНрдЧ CreateObjectHelper
{
рдЬрдирддрд╛ :
// рд╡рд╛рдкрд╕реА рдкреНрд░рдХрд╛рд░
рдЯрд╛рдЗрдкрд░рд╛рдЗрдл IObject *
рдЖрд░ ;
рдирд┐рдЬреА :
рдЯреЗрдореНрдкрд▓реЗрдЯ < рд╡рд░реНрдЧ TBase, рд╡рд░реНрдЧ Tobject >
рдЗрдирд▓рд╛рдЗрди TBase * MakeObject ( ) рдХрд╛рд╕реНрдЯ
{
рдирдпрд╛ CObjectTypeWrapper < TBase, TObject > ( ) рд▓реМрдЯреЗрдВ ;
}
рдЬрдирддрд╛ :
//! рд╕рд╛рдорд╛рдиреНрдп рдорд╛рдорд▓рд╛
рдЯреЗрдореНрдкрд▓реЗрдЯ < рд╡рд░реНрдЧ TObject >
рдЗрдирд▓рд╛рдЗрди tobject * рдСрдкрд░реЗрдЯрд░ ( ) ( Tobject * , ... ) const
{
рд╡рд╛рдкрд╕реА рдХрд░реЗрдВ MakeObject < Tobject, TObject > ( ) ;
}
рдЗрдирд▓рд╛рдЗрди IObject * рдСрдкрд░реЗрдЯрд░ ( ) ( рдмреВрд╕реНрдЯ :: mpl :: void_ ) рдХрд╛рд╕реНрдЯ
{
рдореБрдЦрд░ ( "рдЯрд╛рдЗрдк рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рдЯреВрдЯрд╛ рд╣реБрдЖ рд╣реИ! рдпрд╣рд╛рдБ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП!" )
рд╡рд╛рдкрд╕реА NULL ;
}
рдЬрдирддрд╛ :
// рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖ рдорд╛рдорд▓рд╛, IObjectType1 рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЧрдпрд╛
рдЯреЗрдореНрдкрд▓реЗрдЯ < рд╡рд░реНрдЧ TObject >
IObject * рдСрдкрд░реЗрдЯрд░ ( ) ( Tobject * , IObjectType1 * ) рдХрд╛рд╕реНрдЯ
{
// ...
}
// IObjectType2 рд╕реЗ рдкреНрд░рд╛рдкреНрдд рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖ рдорд╛рдорд▓рд╛
рдЯреЗрдореНрдкрд▓реЗрдЯ < рд╡рд░реНрдЧ TObject >
IObject * рдСрдкрд░реЗрдЯрд░ ( ) ( Tobject * , IObjectType2 * ) рдХрд╛рд╕реНрдЯ
{
// ...
}
} ;
...
int nObjectType = ResolveObjectType ( ... ) ;
рд╡рд╛рдкрд╕реА рдСрдмреНрдЬреЗрдХреНрдЯрдЯреИрдЯреНрд╕ :: CallDoublePointerBasedFunctorWithObjectType (
CreateObjectHelper ( ) ,
nObjectType ) ;
2. рд╡рдВрд╢рд╛рдиреБрдХреНрд░рдо рд╡реГрдХреНрд╖ рдХреЗ рдордзреНрдп рд╕реНрдерд┐рдд рдХрдХреНрд╖рд╛рдУрдВ рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдмрджрд▓рдирд╛, рд╡рд╕реНрддреБ рдХреЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдмрд┐рдирд╛ рдбрд╛рдпрдиреЗрдорд┐рдХ_рдХрд╛рд╕реНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдмрд┐рдирд╛ (рдХреЙрд▓рд╡рд┐рдЯрд╛рдЗрдк рдХреЗ рд╕рд╛рде рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╣рдорд╛рд░реЗ рд╡рд░реНрдЧ рдкрджрд╛рдиреБрдХреНрд░рдо рдкрд░ рд▓рдЧрднрдЧ 50 рдЧреБрдирд╛ рддреЗрдЬ рд╣реИ):
рдЯреЗрдореНрдкрд▓реЗрдЯ < рд╡рд░реНрдЧ TKind >
рд╕рдВрд░рдЪрдирд╛ IsKindOfHelper
{
рдЯрд╛рдЗрдкреНрдбрдлреЗрд▓ рдмреВрд▓
рдЖрд░ ;
рдЗрдирд▓рд╛рдЗрди рдмреВрд▓ рдСрдкрд░реЗрдЯрд░ ( ) ( ... ) рдХрд╛рдВрд╕реНрдЯреЗрдмрд▓
{
рдЭреВрдареЗ рд▓реМрдЯрдирд╛ ;
}
рдЗрдирд▓рд╛рдЗрди рдмреВрд▓ рдСрдкрд░реЗрдЯрд░ ( ) ( рдЯреАрдХреЗрдЗрдВрдб * ) рдХрд╛рд╕реНрдЯ
{
рд╕рдЪ рд▓реМрдЯрдирд╛ ;
}
} ;
рдЯреЗрдореНрдкрд▓реЗрдЯ < рд╡рд░реНрдЧ TObject >
рдЗрдирд▓рд╛рдЗрди рдмреВрд▓ IsKindOf ( int nTypeDescriptor )
{
рд╡рд╛рдкрд╕реА CallWithType ( IsKindOfHelper < TObject > ( ) , nTypeDescriptor ) ;
}
...
// TypeDescriptor рд╡рд░реНрдЪреБрдЕрд▓ func рд╣реИ, рдЬреЛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдкреНрд░рдХрд╛рд░ рдХреЗ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рдХреЛ рд▓реМрдЯрд╛рддрд╛ рд╣реИред
// рдкрд┐рдЫрд▓реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди (рдЖрдкрдХреЛ рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд╣рд╛рдереЛрдВ рд╕реЗ рд▓рд┐рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ)
рдЕрдЧрд░ ( IsKindOf < ISettable > ( рдпрд╣ - > TypeDescriptor ( ) ) )
{
// рдХреБрдЫ рдХрд░реЛ
}
рдЕрдиреНрдпрдерд╛
{
// рдХреБрдЫ рдФрд░ рдХрд░реЛ
}
3. рдПрдХ рд╡реЗрд░рд┐рдПрдмрд▓ рдкрд░ рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдЬрд┐рд╕рдореЗрдВ рдЯрд╛рдЗрдк рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рд╣реЛрддрд╛ рд╣реИ рд╕реАрдзреЗ рдЯрд╛рдЗрдк рдХрд╛ред рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рджреМрд░рд╛рди рдмрд╣реБрдд рдорджрдж рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП (рдпрджрд┐ рдкреНрд░рдХрд╛рд░ рдХрдИ рдмрд╛рд╣рд░реА рдХрд╛рд░рдХреЛрдВ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ):
int ApplySomeWrapper ( int nType )
{
bool bShouldBeWrapperApplied = ... ;
рдЕрдЧрд░ ( bhouldBeWrapperApplied )
{
// IsWrapperApplicable CallWithType рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкреНрд░рдХрд╛рд░ рдХреЗ tobject рдореЗрдВ nType рдХреЛ рдХрдирд╡рд░реНрдЯ рдХрд░рддрд╛ рд╣реИ
// рдФрд░ рдХреЙрд▓ WrapperTraits :: CSomeWrapper :: IsApplicable <TObject> :: рдорд╛рди рдореЗрдЯрд╛рдлрд╝рдВрдХреНрд╢рди
рдЕрдЧрд░ ( IsWrapperApplicable < WrapperTraits :: CSomeWrapper > ( nType ) )
{
// IsWrapperApplicable рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкреНрд░рдХрд╛рд░ рдХреЛ рдХреЙрд▓рд╡рд┐рдЯрд╛рдЗрдк, рдХреЙрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ Tobject рдореЗрдВ рдХрдирд╡рд░реНрдЯ рдХрд░рддрд╛ рд╣реИ,
// рдХреЙрд▓ WrapperTraits :: CSomeWrapper :: MakeWrappedType <TObject> :: рдкреНрд░рдХрд╛рд░ рдореЗрдЯрд╛рдлрд╝рдВрдХреНрд╢рди
// рд▓рд┐рдкрдЯреЗ рд╣реБрдП рдкреНрд░рдХрд╛рд░ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдлрд┐рд░ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП MakeDescriptor рдХреЛ рдХреЙрд▓ рдХрд░реЗрдВред
рд╡рд╛рдкрд╕реА рдХрд░реЗрдВ MakeWrappedType < WrapperTraits :: CSomeWrapper > ( nType ) ;
}
}
рд╡рд╛рдкрд╕реА nType ;
}