рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдЬрд╛рджреВ, рдореЗрдЯрд╛рдлрд╝рдВрдХреНрд╢рди IsValidExpression

рдЕрдЪреНрдЫрд╛ рджрд┐рди, рдкреНрд░рд┐рдп рд╣реЗрдмреНрд░реЛрд╕реЛрд╕рд┐рдЯреАред



рдЖрдЬ рдореИрдВ рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рдЯреНрд░рд┐рдХ рд╕рд╛рдЭрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдЬрд┐рд╕рд╕реЗ рдЖрдк рдХрд┐рд╕реА рд╡рд┐рд╢реЗрд╖ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреА рдпреЛрдЧреНрдпрддрд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред



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

/ * рд╣рдо HasF рдореЗрдЯрд╛рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рд╣рдореЗрдВ рдХрд┐рд╕реА рднреА рд╡рд░реНрдЧ рдХреЗ рд▓рд┐рдП f () рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЕрд╕реНрддрд┐рддреНрд╡ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред * /

DECLARE_IS_VALID_EXPRESSION (

HasF,

( ( U * ) NULL ) - > f ( ) / * рдпрд╣ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗрд╡рд▓ рддрднреА рд╕рдВрдХрд▓рд┐рдд рдХреА рдЬрд╛рддреА рд╣реИ рдпрджрд┐ U :: f () * / ) рдореМрдЬреВрдж рд╣реИ ;



рд╕рдВрд░рдЪрдирд╛ рдлреВ { рд╢реВрдиреНрдп рдПрдл ( ) ; } ;

рд╕рдВрд░рдЪрдирд╛ рдмрд╛рд░ { } ;



BOOST_STATIC_ASSERT ( HasF <A> :: рдореВрд▓реНрдп ) ; / * рдпрд╣рд╛рдБ рд╣рд╕рдлрд╝ <A> :: рдореВрд▓реНрдп рд╕рд╣реА рд╣реЛрдЧрд╛ * /

BOOST_STATIC_ASSERT ( ! рд╣реИрд╕ < B > :: рдореВрд▓реНрдп ) ; / * рдпрд╣рд╛рдБ рд╣рд╕рдлрд╝ <A> :: рдореВрд▓реНрдп рдЧрд▓рдд рд╣реЛрдЧрд╛ * /


рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рд╢рд╛рдпрдж рдкрд╣рд▓реЗ рд╣реА рдЕрдиреБрдорд╛рди рд▓рдЧрд╛ рдЪреБрдХреЗ рд╣реИрдВ, рд╣рдо рд╕реЛрдЪреЗрдВрдЧреЗ рдХрд┐ рдореИрдХреНрд░реЛ DECLARE_IS_VALID_EXPRESSION рдХреИрд╕реЗ рд▓рд┐рдЦреЗрдВред



рдЗрд╕рд▓рд┐рдП, рд╣рдорд╛рд░рд╛ рд▓рдХреНрд╖реНрдп рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдирд╛ рд╕реАрдЦрдирд╛ рд╣реИ рдХрд┐ рдХреЛрдИ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╕рдВрдХрд▓рд┐рдд рд╣реИ рдпрд╛ рдирд╣реАрдВред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╕рдВрдХрд▓рдХ, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдХрд┐рд╕реА рднреА рддреНрд░реБрдЯрд┐ рдХрд╛ рдЙрддреНрдкрд╛рджрди рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП: рдПрдХ рд╕реНрдерд┐рд░рд╛рдВрдХ рдХреЛ рдХреЗрд╡рд▓ 0 рдХреЗ рдорд╛рди рдХреЗ рд╕рд╛рде рдЙрддреНрдкрдиреНрди рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдпрджрд┐ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╕рдВрдХрд▓рд┐рдд рдирд╣реАрдВ рд╣реИ, рдФрд░ 1 рдЕрдиреНрдпрдерд╛ рдХрд╛ рдорд╛рдиред



Relizatsiya



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



рдпрд╣ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ:

$ DECLARE_IS_VALID_EXPRESSION рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВ ( рдирд╛рдо, U_BASED_RUNTIME_EXPRESSION ) \

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

рд╕рдВрд░рдЪрдирд╛ NAME \

{ \ _

/ * рд╣рдореЗрдВ рдХреБрдЫ рдкреНрд░рдХрд╛рд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬреЛ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рддреБрд▓рдирд╛ рдХреЗ рд▓рд┐рдП T рдирд╣реАрдВ рд╣реИ * / \

рд╕рдВрд░рдЪрдирд╛ рд╕реАрдбреАрдореА { } ; \

\

/ * рдпрд╣ рдЕрдзрд┐рднрд╛рд░ рддрднреА рдХрд╛рдо рдХрд░реЗрдЧрд╛ рдЬрдм U_BASED_RUNTIME_EXPRESSION рдореЗрдВ "рддреНрд░реБрдЯрд┐рдпрд╛рдВ" рдирд╣реАрдВ рд╣реЛрдВрдЧреА

** рдЕрдиреНрдпрдерд╛, рдЗрд╕ рдЕрдзрд┐рднрд╛рд░ рдХреЛ SFINAE рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдирдЬрд░рдЕрдВрджрд╛рдЬ рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред * * \ _

рдЯреЗрдореНрдкрд▓реЗрдЯ < рдЯрд╛рдЗрдкрдиреЗрдо U > \

рд╕реНрдерд┐рд░ рдШреЛрд╖рдгрд╛ ( U_BASED_RUNTIME_EXPRESSION ) F ( рд╢реВрдиреНрдп * ) ; \

\

/ * рд▓реЗрдХрд┐рди рдпрд╣ рдЕрдзрд┐рднрд╛рд░ рд╣рдореЗрд╢рд╛ рдореМрдЬреВрдж рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдХреА рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рдХрдо рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рджреАрд░реНрдШрд╡реГрддреНрдд * / \

рдЯреЗрдореНрдкрд▓реЗрдЯ < рдЯрд╛рдЗрдкрдиреЗрдо U > \

рд╕реНрдерд┐рд░ рд╕реАрдбреАрдореА рдПрдл ( ... ) ; \

\

/ * рдпрд╣ рдЯрд╛рдИрдкрдбреЗрдлрд╝ рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рдмрд┐рдирд╛ рдпрд╣ рд╡рд░реНрдЧ рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ :(

** (рд╡рд┐рдЬреБрдЕрд▓ рд╕реНрдЯреВрдбрд┐рдпреЛ рдЯреАрдо рдХреЗ рдкрд░реАрдХреНрд╖рдХреЛрдВ рдХреЛ рд╢реБрднрдХрд╛рдордирд╛рдПрдБ рднреЗрдЬрдиреЗ рдХрд╛ рдЕрд╡рд╕рд░ рд▓реЗрддреЗ рд╣реБрдП) * / \

рдЯрд╛рдЗрдкрдбрд┐рдл рдШреЛрд╖рдгрд╛рдкрддреНрд░ ( F < T > ( nullptr ) ) \

TDummy; \

\

рдПрдирдо \ _

{ \ _

рдпрджрд┐ U_BASED_RUNTIME_EXPRESSION рдореЗрдВ "рддреНрд░реБрдЯрд┐рдпрд╛рдВ" рдФрд░ 0 рдЕрдиреНрдпрдерд╛ рдирд╣реАрдВ рд╣реИрдВ рддреЛ / * рдорд╛рди 1 рд╣реЛрдЧрд╛

** рдХреНрдпреЛрдВ? \

** рдпрджрд┐ рдХреЛрдИ "рддреНрд░реБрдЯрд┐рдпрд╛рдВ" рдирд╣реАрдВ рд╣реИрдВ, рддреЛ F рдХреЗ рджреЛрдиреЛрдВ рд╕рдВрд╕реНрдХрд░рдг рдореМрдЬреВрдж рд╣реИрдВ, рдФрд░ F <T> (nullptr) рдЙрд╕ рдХрд╛ рдЪрдпрди рдХрд░реЗрдВ: \

** рдЬрд┐рд╕рдореЗрдВ рдХреЛрдИ рджреАрд░реНрдШрд╡реГрддреНрдд рдирд╣реАрдВ рд╣реИ, рдЕрд░реНрдерд╛рддреНред рд╣рдорд╛рд░реЗ рдкрд░реАрдХреНрд╖рдг рдХреА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рд╕рд╛рде, рдФрд░ рдЗрд╕рдХреА рд╡рд╛рдкрд╕реА рдкреНрд░рдХрд╛рд░ рдирд╣реАрдВ рд╣реИ

** рд╕реАрдбреАрдореА рдирд╣реАрдВ, рдХреНрдпреЛрдВрдХрд┐ рд╕реАрдбреАрдореА рдХреЛ рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред \

** рдпрджрд┐ "рддреНрд░реБрдЯрд┐рдпрд╛рдВ" рд╣реИрдВ, рддреЛ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдП рдЧрдП рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рд╕рд╛рде рд╡рд┐рдХрд▓реНрдк рдПрдл рдХреЛ рдмрд╛рд╣рд░ рдирд┐рдХрд╛рд▓ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдФрд░, \ _

** рддрджрдиреБрд╕рд╛рд░, F <T> (nullptr) рджреВрд╕рд░рд╛ рдЕрдзрд┐рднрд╛рд░ (рдЬреЛ рд╕реАрдбреАрдореА рд▓реМрдЯрд╛рддрд╛ рд╣реИ) рдХрд╛ рдЪрдпрди рдХрд░реЗрдЧрд╛ * / \

рдорд╛рди = ! рдмрдврд╝рд╛рд╡рд╛ рджреЗрдирд╛ :: is_same < CDummy, TDummy > :: value \

} ; \

} ;


рдпрд╣ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди, рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, C ++ 0x рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ (рдореЗрд░рд╛ рд╕рдВрдХрд▓рдХ VC10 рд╣реИ)ред рдирдП рдорд╛рдирдХ рдХреЗ рдмрд┐рдирд╛ рдРрд╕рд╛ рдХрд░рдирд╛ рд╕реИрджреНрдзрд╛рдВрддрд┐рдХ рд░реВрдк рд╕реЗ рд╕рдВрднрд╡ рд╣реИ (рд╡рд┐рдЪрд╛рд░ рд╕рдорд╛рди рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдШреЛрд╖рдгрд╛ рдХреЗ рдмрдЬрд╛рдп рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ)ред рд▓реЗрдХрд┐рди! рдпрд╣рд╛рдБ рдлрд┐рд░ рд╕реЗ, рдореИрдВ Microsoft рдкрд░реАрдХреНрд╖рдХреЛрдВ рдХреЛ рдирдорд╕реНрддреЗ рдХрд╣рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдБ, рдЬреИрд╕рд╛ рдХрд┐ sizeof рдЯреЗрдореНрдкрд▓реЗрдЯ рдкрд░рд┐рднрд╛рд╖рд╛ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ - рдпрд╣ рд╡рд╣рд╛рдВ "рдЕрдкреЗрдХреНрд╖рд┐рдд" рдирд╣реАрдВ рд╣реИ (рдпрджрд┐ рдореБрдЭреЗ рд╕рд╣реА рдпрд╛рдж рд╣реИ)ред рдЬреАрд╕реАрд╕реА рдореЗрдВ, рдЖрдХрд╛рд░ рдкрд░ рд╕рдорд╛рдзрд╛рди рдареАрдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред



рдЖрд╡реЗрджрди



рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдирд┐рдореНрди рдХреЛрдб рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИ:

/ * рдореЗрдЯрд╛рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ IsStreamSerializationSupported, рдЬреЛ рд╡рд╛рдкрд╕ рд▓реМрдЯрддрд╛ рд╣реИ

** рдпрд╣ рд╕рдЪ рд╣реИ рдХрд┐ рдпрджрд┐ рддрд░реНрдХ рдзрд╛рд░рд╛рдУрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЗрдирдкреБрдЯ / рдЖрдЙрдЯрдкреБрдЯ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ * /

DECLARE_IS_VALID_EXPRESSION (

IsStreamSerializationSupported,

( ( std :: cout << * ( U * ) NULL ) , ( std :: cin >> * ( U * ) NULL ) ; ) ;



/ * рдбрдмрд▓ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ рдЗрдирдкреБрдЯ / рдЖрдЙрдЯрдкреБрдЯ рд╕реНрдЯреНрд░реАрдо рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ "рдмреЙрдХреНрд╕ рд╕реЗ рдмрд╛рд╣рд░" * /

BOOST_STATIC_ASSERT ( IsStreamSerializationSupported < double > :: value ) ;



рд╕рдВрд░рдЪрдирд╛ рдлреВ { } ;



/ * рд▓реЗрдХрд┐рди рдзрд╛рд░рд╛рдУрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдлреВ рдЗрдирдкреБрдЯ / рдЖрдЙрдЯрдкреБрдЯ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ :( * /

BOOST_STATIC_ASSERT ( ! IsStreamSerializationSupported < Foo > :: value ) ;



рд╕рдВрд░рдЪрдирд╛ рдмрд╛рд░ { } ;



рдЯреЗрдореНрдкрд▓реЗрдЯ < рд╡рд░реНрдЧ TChar, рд╡рд░реНрдЧ рд▓рдХреНрд╖рдг >

std :: basic_ostream < TChar, рд▓рдХреНрд╖рдг > рдФрд░ рдСрдкрд░реЗрдЯрд░ << (

std :: basic_ostream < TChar, Traits > & , const Bar & ) ;



рдЯреЗрдореНрдкрд▓реЗрдЯ < рд╡рд░реНрдЧ TChar, рд╡рд░реНрдЧ рд▓рдХреНрд╖рдг >

std :: basic_istream < TChar, рд▓рдХреНрд╖рдг > рдФрд░ рдСрдкрд░реЗрдЯрд░ >> (

std :: basic_istream < TChar, Traits > & , Bar & ) ;



/ * рдмрд╛рд░ рдзрд╛рд░рд╛рдУрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ I / O рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рд╕рдВрдЧрдд рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред * /

BOOST_STATIC_ASSERT ( IsStreamSerializationSupported < Bar > :: value ) ;


рдРрд╕реА рдЪреАрдЬреЗрдВ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддреА рд╣реИрдВ рдХрд┐ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЛ рджрд┐рдпрд╛ рдЧрдпрд╛ рдкреНрд░рдХрд╛рд░ рд╡рд┐рднрд┐рдиреНрди рдЕрд╡рдзрд╛рд░рдгрд╛рдУрдВ рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ (рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЕрд╡рдзрд╛рд░рдгрд╛ рд╕реЗ рдорд┐рд▓рд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрдЯреНрд░реАрдо рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЗрдирдкреБрдЯ рдХреЛ рдЗрдирдкреБрдЯ / рдЖрдЙрдЯрдкреБрдЯ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП)ред



рдЗрд╕рдХреЗ рд▓рд┐рдП рдореИрдВ рдЕрд▓рд╡рд┐рджрд╛ рдХрд╣рддрд╛ рд╣реВрдВ, рдЖрдк рд╕рднреА рдХрд╛ рдзреНрдпрд╛рди рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж! :)



All Articles