рдЯреЗрдореНрдкрд▓реЗрдЯ рдЬрд╛рджреВ CallWithType рдкреИрдЯрд░реНрди

рд╢реБрдн рджрд┐рди, рдкреНрд░рд┐рдп рдЦрд╛рдмрд░реЛрд╡рдЪрд┐рдпреЛрдВ!



рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рдореИрдВ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ C ++ рдореЗрдВ рдЖрдк рд╕рдВрдХрд▓рди-рд╕рдордп рдбреЗрдЯрд╛ (рдкреНрд░рдХрд╛рд░) рдХреЛ рд░рди-рдЯрд╛рдЗрдо рдбреЗрдЯрд╛ (рдкреВрд░реНрдгрд╛рдВрдХ рдорд╛рди) рдореЗрдВ рдХреИрд╕реЗ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд ред



рдПрдХ рдЙрджрд╛рд╣рд░рдг:

int nType = ... ;



рдЕрдЧрд░ ( рдмрдврд╝рд╛рд╡рд╛ :: is_base_of < ISettable, / * ... рдЬрд╛рджреБрдИ рд░реВрдк рд╕реЗ nType рджреНрд╡рд╛рд░рд╛ рдЫрд┐рдкрд╛ рд╣реБрдЖ рдкреНрд░рдХрд╛рд░ рдпрд╣рд╛рдБ рд╣рд▓ рдХрд░реЗрдВ ... * / > :: рдореВрд▓реНрдп )

{

// рдХреБрдЫ рдХрд░реЛ

}

рдЕрдиреНрдпрдерд╛

{

// рдХреБрдЫ рдФрд░ рдХрд░реЛ

}


рдпрд╣ рдкреВрд░рд╛ рд╡рд┐рд╖рдп рдпрд╣ рд╕рдордЭрдиреЗ рдХреЗ рдЙрджреНрджреЗрд╢реНрдп рд╕реЗ рд╣реИ рдХрд┐ "nType рджреНрд╡рд╛рд░рд╛ рдпрд╣рд╛рдВ рдЫрд┐рдкреЗ рд╣реБрдП рдЬрд╛рджреБрдИ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рдорд╛рдзрд╛рди" рдХреЗ рдмрдЬрд╛рдп рдХреНрдпрд╛ рд▓рд┐рдЦрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред



рдпрджрд┐ рдЖрдк рдХреЗрд╡рд▓ рдкрд░рд┐рдгрд╛рдо рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ, рддреЛ рдЕрдВрддрд┐рдо рдЕрдиреБрднрд╛рдЧ рдкрд░ рдЬрд╛рдПрдВред



рдереЛрдбрд╝рд╛ рдЗрддрд┐рд╣рд╛рд╕



рдпрд╣ рд╕рдм рдЗрд╕ рддрдереНрдп рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рд╣реБрдЖ рдХрд┐, рдбреНрдпреВрдЯреА рдкрд░, рдореБрдЭреЗ рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдПрдХ рдЬрдЯрд┐рд▓ рдХрд╛рд░рдЦрд╛рдиреЗ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереА, рдЬреЛ рд▓рдЧрднрдЧ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдХрд╛рдо рдХрд░рддрд╛ рдерд╛: рдПрдХ рд╡рд╕реНрддреБ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдмреБрд▓рд╛рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЬреЛ рдХрд┐ рдЧрддрд┐рд╢реАрд▓ рдбреЗрдЯрд╛ рдХреЗ рд░рд╕рд╛рддрд▓ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдмрдирд╛рдИ рдЧрдИ рд╡рд╕реНрддреБ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреА рдПрдХ рдЖрдИрдбреА рд▓реМрдЯрд╛рддрд╛ рд╣реИред рдпрд╣ рдЖрдИрдбреА рд╕реНрд╡рд┐рдЪ рдорд╛рдорд▓реЗ рдореЗрдВ рдЧрд┐рд░ рдЧрдИ, рдЬрд┐рд╕рдиреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рд╡рд╕реНрддреБ рдмрдирд╛рдИ, рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд╕реЗ:

int nObjectType = ResolveObjectType ( ... ) ;



рдмрдврд╝рд╛рд╡рд╛ рджреЗрдирд╛ :: share_ptr < IObject > pObject = CreateObject ( nObjectType ) ;


рдЗрд╕ рдкреНрд░рдгрд╛рд▓реА рдореЗрдВ рддрдм рддрдХ рд╕рдм рдХреБрдЫ рдареАрдХ рдерд╛ рдЬрдм рддрдХ рдХрд┐ рдпрд╣ рдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рд╣реЛ рдЬрд╛рддрд╛ рдХрд┐ рдХреБрдЫ рд░рдирдЯрд╛рдЗрдо рдкрд░рд┐рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ, рдлреЙрд░реНрдо рдХреЗ рд░реИрдкрд░ рдХреЛ рдХреБрдЫ рд╡рд╕реНрддреБрдУрдВ рдкрд░ рд▓рдЯрдХрд╛рдП рдЬрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:

рдЯреЗрдореНрдкрд▓реЗрдЯ < рд╡рд░реНрдЧ TObject >

рд╡рд░реНрдЧ CFilter : рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ Tobject

{

рд╡рд░реНрдЪреБрдЕрд▓ рдмреВрд▓ рдлрд╝рд┐рд▓реНрдЯрд░рд╡реИрд▓реНрдпреВ ( ... ) { ... } ;

} ;


рдЗрд╕ рддрд░рд╣ рдХреЗ рд░реИрдкрд░ рдХреБрдЫ рд╢рд░реНрддреЛрдВ рдХреЗ рддрд╣рдд рдЖрд╡рд╢реНрдпрдХ рдирдИ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдореЗрдВ рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВред рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ, рд╢реБрд░реВ рдореЗрдВ рд░реИрдкрд░ рд▓рдЧрд╛рддрд╛рд░ рдФрд░ рдЕрдзрд┐рдХ рд╕реЗ рдХрдо рдФрд░ рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреА рд╡рд╕реНрддреБрдУрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдереЛрдбрд╝рд╛ рдХрдо рд▓рдЯрдХрд╛рдП рдЧрдП рдереЗ (рдЗрд╕рдХреЗ рд▓рд┐рдП рдХреЛрдб рдХреА рдХреБрдЫ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдирд╛ рдЖрд╡рд╢реНрдпрдХ рдерд╛, рдмрд╣реБрдд рд╕рд░рд▓)ред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЕрдирд╛рд╡рд╢реНрдпрдХ рдЖрд╡рд░рдг, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЙрдиреНрд╣реЛрдВрдиреЗ рдХрд╛рдо рдХреЗ рддрд░реНрдХ рдХреЛ рдиреБрдХрд╕рд╛рди рдирд╣реАрдВ рдкрд╣реБрдВрдЪрд╛рдпрд╛, рд▓реЗрдХрд┐рди рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдЖрдХрд╛рд░ рдореЗрдВ рд╡реГрджреНрдзрд┐ рдХреА, рдЬреЛ рдЕрд╕реНрд╡реАрдХрд╛рд░реНрдп рдерд╛: рджреЛрдиреЛрдВ рдХрд╛рд░рдЦрд╛рдиреЗ рдФрд░ рдЗрд╕рдХреА рдорджрдж рд╕реЗ рдмрдирд╛рдИ рдЧрдИ рд╡рд╕реНрддреБрдПрдВ рдкреНрд░рджрд░реНрд╢рди рдФрд░ рд╕реНрдореГрддрд┐ рдХреА рдЦрдкрдд рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдереАрдВред



рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд░реИрдкрд░ рдХреЛ рд╡реИрдХрд▓реНрдкрд┐рдХ рд░реВрдк рд╕реЗ рд╢рд╛рдорд┐рд▓ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рдерд╛ред рд╕рдорд╕реНрдпрд╛рдПрдБ рддреБрд░рдВрдд рдЙрддреНрдкрдиреНрди рд╣реБрдИ:

рдпрд╣ рд╕рдм рдорд╣рд╕реВрд╕ рдХрд░рддреЗ рд╣реБрдП, рдореИрдВ рдмреИрда рдЧрдпрд╛ рдФрд░ рд╕реЛрдЪрд╛ред рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ рдореБрдЭреЗ рдЬреЛ рдХреБрдЫ рднреА рдХрд░рдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рдереА, рд╡рд╣ рд╕реАрдЦ рдЧрдпрд╛ рдерд╛ рдХрд┐ рдЧреЗрдЯрдУрдмрдЬреЗрдХреНрдЯрдЯрд╛рдЗрдк (...) рджреНрд╡рд╛рд░рд╛ рд▓реМрдЯрд╛рдП рдЧрдП рдореВрд▓реНрдп рдХреЗ рдкреАрдЫреЗ рдЫрд┐рдкреЗ рд╣реБрдП рдкреНрд░рдХрд╛рд░ рдХреЛ рдХреИрд╕реЗ рдЖрдХрд░реНрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдП, рддрд╛рдХрд┐ рдпрд╣ рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЗ рд▓рд┐рдП рд╕реНрдкрд╖реНрдЯ рд╣реЛ, рдЕрд░реНрдерд╛рддреНред рддрд╛рдХрд┐ рдЖрдк рдЖрддреНрдорд╛ рдореЗрдВ рдмрд╛рддреЗрдВ рд▓рд┐рдЦ рд╕рдХреЗрдВ:

int nType = ... ;



рдЕрдЧрд░ ( рдмрдврд╝рд╛рд╡рд╛ :: is_base_of < ISettable, / * ... рдЬрд╛рджреБрдИ рд░реВрдк рд╕реЗ nType рджреНрд╡рд╛рд░рд╛ рдЫрд┐рдкрд╛ рд╣реБрдЖ рдкреНрд░рдХрд╛рд░ рдпрд╣рд╛рдБ рд╣рд▓ рдХрд░реЗрдВ ... * / > :: рдореВрд▓реНрдп )

{

// рдХреБрдЫ рдХрд░реЛ

}

рдЕрдиреНрдпрдерд╛

{

// рдХреБрдЫ рдФрд░ рдХрд░реЛ

}


рдореЗрд░рд╛ рдкрд╣рд▓рд╛ рд╡рд┐рдЪрд╛рд░: "рдпрд╣ рдЕрд╕рдВрднрд╡ рд╣реИ!"



рд╕рд╛рдБрдЪрд╛ рдЬрд╛рджреВ, рдпрд╛ рдЕрд╕рдВрднрд╡ рд╕рдВрднрд╡ рд╣реИ!



рдереЛрдбрд╝рд╛ рдФрд░ рд╕реЛрдЪрдиреЗ рдХреЗ рдмрд╛рдж, рдореИрдВ рдЗрд╕ рдирд┐рд╖реНрдХрд░реНрд╖ рдкрд░ рдкрд╣реБрдВрдЪрд╛ рдХрд┐ рдЖрдкрдХреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рджреЛ рдХрд╛рд░реНрдп рд▓рд┐рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:

//! Tobject рдХреЗ рд▓рд┐рдП рдСрдмреНрдЬреЗрдХреНрдЯ рдСрдмреНрдЬреЗрдХреНрдЯ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рд╕рдВрд╡рд╛рджрджрд╛рддрд╛ рд▓реМрдЯрд╛рддрд╛ рд╣реИред

рдЯреЗрдореНрдкрд▓реЗрдЯ < рд╡рд░реНрдЧ TObject >

рдЗрдирд▓рд╛рдЗрди рдЗрдВрдЯ рдореЗрдХрдбрд╕реНрдХреНрд░рд┐рдкреНрдЯ ( ) ;



//! рдХреЙрд▓ ncptr рдХреЗ рд╕рд╛рде rcFunctor nTypeDescriptor рджреНрд╡рд╛рд░рд╛ рдЫрд┐рдкрд╛рдП рдЧрдП рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдПред

рдЯреЗрдореНрдкрд▓реЗрдЯ < рд╡рд░реНрдЧ TFunctor >

рдЗрдирд▓рд╛рдЗрди рдЯрд╛рдЗрдкрдиреЗрдо рдХрд╛ рдирд╛рдо Impl :: ResolveReturnType < TFunctor > :: рдкреНрд░рдХрд╛рд░ CallWithType ( const TFunctor & rcFunctor, int 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ред

рд╡рд╛рд╕реНрддрд╡рд┐рдХ рджреБрдирд┐рдпрд╛ рдореЗрдВ, рдЬреНрдЮрд╛рдд рд╡рд╕реНрддреБрдУрдВ рдХреА рдПрдХ рд╕реВрдЪреА рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдЯреЗрдореНрдкрд▓реЗрдЯ рдЬрд╛рджреВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд▓рдЧрднрдЧ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рддрд░реАрдХреЗ рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:

рдпрд╣ рдХреНрд░рд┐рдпрд╛ рд╕рдВрдХрд▓рди рдЪрд░рдг рдореЗрдВ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреА рдЬрд╛рддреА рд╣реИ, рдЗрд╕рдореЗрдВ рд▓рдЧрднрдЧ 200 рд▓рд╛рдЗрдиреЗрдВ рд╣реЛрддреА рд╣реИрдВред рдПрдХ рдирдпрд╛ рдЖрд╡рд░рдг рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП (рдФрд░ рд╕рднреА рдирдП рдкреНрд░рдХрд╛рд░ рдЬреЛ рдЖрд╡рд░рдг рд▓рд╛рдПрдЧрд╛), рдЖрдкрдХреЛ рдХреЗрд╡рд▓ 10 рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ рд▓рд┐рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЬрдмрдХрд┐ рдирдП рдкреНрд░рдХрд╛рд░ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдореМрдЬреВрджрд╛ рдХреЛрдб рджреНрд╡рд╛рд░рд╛ рдЙрдард╛рдП рдЬрд╛рдПрдВрдЧреЗред



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 ;

}



All Articles