рдХрд╛рд╕реНрдЯрд┐рдВрдЧ рдЯрд╛рдЗрдк рдХрд░реЗрдВ

рдХреНрдпреВрдЯреА рдбреЗрд╡рд▓рдкрд░ рдбреЗрдЬрд╝ 2010 рд╕рдореНрдореЗрд▓рди рдореЗрдВ рд╣реЛрдиреЗ рдХреЗ рдирд╛рддреЗ, рдореБрдЭреЗ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ рдХреНрдпреВрдЯреА рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓реА рд╡рд┐рднрд┐рдиреНрди рд╡рд┐рджреЗрд╢реА рдХрдВрдкрдирд┐рдпреЛрдВ рдореЗрдВ рд╕рд╛рдХреНрд╖рд╛рддреНрдХрд╛рд░ рдореЗрдВ рд╕рдмрд╕реЗ рд▓реЛрдХрдкреНрд░рд┐рдп рдкреНрд░рд╢реНрдиреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ C ++ рдореЗрдВ рдЯрд╛рдЗрдк рд░реВрдкрд╛рдВрддрд░рдг рдХреЗ рддрд░реАрдХреЛрдВ рдореЗрдВ рдЕрдВрддрд░ рдХрд╛ рд╕рд╡рд╛рд▓ рд╣реИред рдЗрд╕рд▓рд┐рдП рдпрд╣рд╛рдБ рдореИрдВ static_cast , dynam_cast , const_cast , reinterpret_cast , C-style cast , qobject_cast рдФрд░ qvariant_cast рдХреЗ рдмреАрдЪ рдореБрдЦреНрдп рдЕрдВрддрд░ рдХреЛ рджреЗрдЦреВрдВрдЧрд╛







1. рд╕реНрдЯреЗрдЯрд┐рдХ_рдХрд╛рд╕реНрдЯ ред



рд╡рд╛рдХреНрдп рд░рдЪрдирд╛:

  TYPE static_cast <TYPE> (рдСрдмреНрдЬреЗрдХреНрдЯ); 




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



2. рдбрд╛рдпрдиреЗрдорд┐рдХ_рдХрд╛рд╕реНрдЯ



рд╡рд╛рдХреНрдп рд░рдЪрдирд╛:

  TYPE рдФрд░ рдбрд╛рдпрдиреЗрдорд┐рдХ_рдХрд╛рд╕реНрдЯ <TYPE &> (рдСрдмреНрдЬреЗрдХреНрдЯ);
 TYPE * рдбрд╛рдпрдиреЗрдорд┐рдХ_рдХрд╛рд╕реНрдЯ <TYPE *> (рдСрдмреНрдЬреЗрдХреНрдЯ); 




рд░рдирдЯрд╛рдЗрдо рдкрд░ рдЧрддрд┐рд╢реАрд▓ рдХрд╛рд╕реНрдЯрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд▓рд┐рдВрдХ рдХреЗ рд▓рд┐рдП рдЧрд▓рдд рдХрд╛рд╕реНрдЯрд┐рдВрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, std :: bad_cast рдЕрдкрд╡рд╛рдж рдХреЛ рдлреЗрдВрдХ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ 0 рдкреЙрдЗрдВрдЯрд░реНрд╕ рдХреЗ рд▓рд┐рдП рд▓реМрдЯрд╛ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред RTTI (рд░рдирдЯрд╛рдЗрдо рдЯрд╛рдЗрдк рдЗрдирдлреЙрд░реНрдореЗрд╢рди) рд╕рд┐рд╕реНрдЯрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдЖрднрд╛рд╕реА рд╡рдВрд╢рд╛рдиреБрдХреНрд░рдо рд╕рд╣рд┐рдд рд╡рд┐рд░рд╛рд╕рдд рдкрджрд╛рдиреБрдХреНрд░рдо рдХреЗ рдЕрдиреБрд╕рд╛рд░ рд╕реБрд░рдХреНрд╖рд┐рдд рдкреНрд░рдХрд╛рд░ рдХреА рдХрд╛рд╕реНрдЯрд┐рдВрдЧред



3. const_cast ред



рд╡рд╛рдХреНрдп рд░рдЪрдирд╛:

  TYPE const_cast <TYPE> (рдСрдмреНрдЬреЗрдХреНрдЯ); 




рд╢рд╛рдпрдж рд╕рдмрд╕реЗ рд╕рд░рд▓ рдкреНрд░рдХрд╛рд░ рд░реВрдкрд╛рдВрддрд░рдгред рд╕реАрд╡реА рдХреНрд╡рд╛рд▓рд┐рдлрд╛рдпрд░ рдирд┐рдХрд╛рд▓рддрд╛ рд╣реИ - рдХрд╛рдВрд╕реНрдЯреЗрдмрд▓ рдФрд░ рд╡рд╛рд╖реНрдкрд╢реАрд▓, рдпрд╛рдиреА, рдХрд╛рдВрд╕реНрдЯреЗрдмрд┐рд▓рд┐рдЯреА рдФрд░ рдХрдВрдкрд╛рдЗрд▓рд░ рджреНрд╡рд╛рд░рд╛ рд╡реЗрд░рд┐рдПрдмрд▓ рдХреЛ рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝ рдХрд░рдиреЗ рд╕реЗ рдЗрдВрдХрд╛рд░ рдХрд░рдирд╛ред рдпрд╣ рд░реВрдкрд╛рдВрддрд░рдг рд╕рдВрдХрд▓рди рд╕реНрддрд░ рдкрд░ рдЬрд╛рдВрдЪрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреА рд░реВрдкрд╛рдВрддрд░рдг рддреНрд░реБрдЯрд┐ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдПрдХ рд╕рдВрджреЗрд╢ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред



4. reinterpret_cast



рд╡рд╛рдХреНрдп рд░рдЪрдирд╛:

  TYPE reinterpret_cast <TYPE> (рдСрдмреНрдЬреЗрдХреНрдЯ); 




рдмрд┐рдирд╛ рдЬрд╛рдВрдЪ рдХреЗ рдХрд╛рд╕реНрдЯрд┐рдВрдЧ рдХрд░реЗрдВред reinterpret_cast - рд╕рдВрдХрд▓рдХ рдХрд╛ рд╕реАрдзрд╛ рд╕рдВрджрд░реНрднред рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреЗрд╡рд▓ рддрднреА рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдЕрдкрдиреЗ рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЖрд╢реНрд╡рд╕реНрдд рд╣реЛред рд╕реНрдерд┐рд░ рдФрд░ рдЕрд╕реНрдерд┐рд░ рдирд╣реАрдВ рдирд┐рдХрд╛рд▓рддрд╛ рд╣реИред рдПрдХ рдкреЙрдЗрдВрдЯрд░ рдХреЛ рдкреЙрдЗрдВрдЯрд░ рдбрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдПрдХ рдкреЙрдЗрдВрдЯрд░ рдХреЛ рдкреВрд░реЗ рдФрд░ рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрддред



5. рд╕реА-рд╕реНрдЯрд╛рдЗрд▓ рдХрд╛рд╕реНрдЯ



рд╡рд╛рдХреНрдп рд░рдЪрдирд╛:

  TYPE (TYPE *) рдСрдмреНрдЬреЗрдХреНрдЯ; 




рдкреНрд░рдХрд╛рд░ рд░реВрдкрд╛рдВрддрд░рдг рдХреА рдПрдХ рд╕реБрд╕рдВрдЧрдд рд╡рд┐рдзрд┐ред рд╢рд╛рдпрдж рд╕рдмрд╕реЗ рдЕрд╡рд╛рдВрдЫрдиреАрдп рдкреНрд░рдХрд╛рд░ рд░реВрдкрд╛рдВрддрд░рдг рд╡рд┐рдзрд┐ред рд╕реНрдЯреНрд░реИрд╕рдкреБрдк рд▓рд┐рдЦрддреЗ рд╣реИрдВ:

"рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЗрд╕ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХрд╛ рдХреНрдпрд╛ рдЕрд░реНрде рд╣реИ - x = (T) y; ред рд╣рдо рдирд╣реАрдВ рдЬрд╛рдирддреЗред рдпрд╣ рдЯрд╛рдЗрдк T, рдкреНрд░рдХрд╛рд░ x рдФрд░ y рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИред рдЯреА рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдирд╛рдо рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЯрд╛рдЗрдкрдбрд┐рдл, рдпрд╛ рдпрд╣ рдПрдХ рдЯреЗрдореНрдкрд▓реЗрдЯ рдкреИрд░рд╛рдореАрдЯрд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рд╢рд╛рдпрдж x рдФрд░ y рдЕрджрд┐рд╢ рдЪрд░ рд╣реИрдВ рдФрд░ T рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рдореВрд▓реНрдп рдХреЛ рджрд░реНрд╢рд╛рддрд╛ рд╣реИред рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ x, Y рдФрд░ T рд╕реЗ рдкреНрд░рд╛рдкреНрдд рд╡рд░реНрдЧ рдХреА рдПрдХ рд╡рд╕реНрддреБ рд╣реИ рдФрд░ рдПрдХ рдиреАрдЪреЗ рдХреА рдУрд░ рдкрд░рд┐рд╡рд░реНрддрди рд╣реИред рдЗрд╕ рдХрд╛рд░рдг рд╕реЗ, рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдпрд╣ рдирд╣реАрдВ рдЬрд╛рди рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рд╡рд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреНрдпрд╛ рдХрд░ рд░рд╣рд╛ рд╣реИред "

рд╕реА-рд╕реНрдЯрд╛рдЗрд▓ рдореЗрдВ рдЯрд╛рдЗрдк рдХрд╛рд╕реНрдЯрд┐рдВрдЧ рдХреЗ рдЕрд╡рд╛рдВрдЫрдиреАрдп рдЙрдкрдпреЛрдЧ рдХрд╛ рджреВрд╕рд░рд╛ рдХрд╛рд░рдг рд╣реИ, рдкреНрд░рдХрд╛рд░ рдХреЗ рдХрд╛рд╕реНрдЯрд┐рдВрдЧ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреА рд╢реНрд░рдорд╕рд╛рдзреНрдпрддрд╛ред



6. qobject_cast



рд╡рд╛рдХреНрдп рд░рдЪрдирд╛:

  TYPE qobject_cast <TYPE> (QObject * рдСрдмреНрдЬреЗрдХреНрдЯ) 




рдЯрд╛рдЗрдк рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ QObject * рдСрдмреНрдЬреЗрдХреНрдЯ рдЯрд╛рдЗрдк рдХрд░рддрд╛ рд╣реИ рдЕрдЧрд░ рдЯрд╛рдЗрдк TYPE рдХрд╛ рдСрдмреНрдЬреЗрдХреНрдЯ рдпрд╛ рдЯрд╛рдЗрдк TYPE рд╕реЗ рдЗрдирд╣реЗрд░рд┐рдЯ рдХрд░рддрд╛ рд╣реИ рддреЛ 0. 0. рдХреНрдпреВрдмрдЬреЗрдХреНрдЯ_рдХрд╛рд╕реНрдЯ 0 рд╕реЗ 0. рднреА рджреЗрддрд╛ рд╣реИред рд╡рд░реНрдЧ рдХреЛ QObject рд╕реЗ рд╡рд╛рд░рд┐рд╕ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ Q_OBJECT рдореИрдХреНрд░реЛ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдлрд╝рдВрдХреНрд╢рди рдорд╛рдирдХ рдбрд╛рдпрдиреЗрдорд┐рдХ_рдХрд╛рд╕реНрдЯ рдХреЗ рд╕рдорд╛рди рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди RTTI рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдпрд╣рд╛рдБ рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЛ Qt 4.7.0 рдореЗрдВ рдХреИрд╕реЗ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:



template < class T> inline T qobject_cast(QObject * object ) { #if !defined(QT_NO_MEMBER_TEMPLATES) && !defined(QT_NO_QOBJECT_CHECK) reinterpret_cast<T>(0)->qt_check_for_QOBJECT_macro(*reinterpret_cast<T>( object )); #endif return static_cast<T>(reinterpret_cast<T>(0)->staticMetaObject.cast( object )); } * This source code was highlighted with Source Code Highlighter .



  1. template < class T> inline T qobject_cast(QObject * object ) { #if !defined(QT_NO_MEMBER_TEMPLATES) && !defined(QT_NO_QOBJECT_CHECK) reinterpret_cast<T>(0)->qt_check_for_QOBJECT_macro(*reinterpret_cast<T>( object )); #endif return static_cast<T>(reinterpret_cast<T>(0)->staticMetaObject.cast( object )); } * This source code was highlighted with Source Code Highlighter .



  2. template < class T> inline T qobject_cast(QObject * object ) { #if !defined(QT_NO_MEMBER_TEMPLATES) && !defined(QT_NO_QOBJECT_CHECK) reinterpret_cast<T>(0)->qt_check_for_QOBJECT_macro(*reinterpret_cast<T>( object )); #endif return static_cast<T>(reinterpret_cast<T>(0)->staticMetaObject.cast( object )); } * This source code was highlighted with Source Code Highlighter .



  3. template < class T> inline T qobject_cast(QObject * object ) { #if !defined(QT_NO_MEMBER_TEMPLATES) && !defined(QT_NO_QOBJECT_CHECK) reinterpret_cast<T>(0)->qt_check_for_QOBJECT_macro(*reinterpret_cast<T>( object )); #endif return static_cast<T>(reinterpret_cast<T>(0)->staticMetaObject.cast( object )); } * This source code was highlighted with Source Code Highlighter .



  4. template < class T> inline T qobject_cast(QObject * object ) { #if !defined(QT_NO_MEMBER_TEMPLATES) && !defined(QT_NO_QOBJECT_CHECK) reinterpret_cast<T>(0)->qt_check_for_QOBJECT_macro(*reinterpret_cast<T>( object )); #endif return static_cast<T>(reinterpret_cast<T>(0)->staticMetaObject.cast( object )); } * This source code was highlighted with Source Code Highlighter .



  5. template < class T> inline T qobject_cast(QObject * object ) { #if !defined(QT_NO_MEMBER_TEMPLATES) && !defined(QT_NO_QOBJECT_CHECK) reinterpret_cast<T>(0)->qt_check_for_QOBJECT_macro(*reinterpret_cast<T>( object )); #endif return static_cast<T>(reinterpret_cast<T>(0)->staticMetaObject.cast( object )); } * This source code was highlighted with Source Code Highlighter .



  6. template < class T> inline T qobject_cast(QObject * object ) { #if !defined(QT_NO_MEMBER_TEMPLATES) && !defined(QT_NO_QOBJECT_CHECK) reinterpret_cast<T>(0)->qt_check_for_QOBJECT_macro(*reinterpret_cast<T>( object )); #endif return static_cast<T>(reinterpret_cast<T>(0)->staticMetaObject.cast( object )); } * This source code was highlighted with Source Code Highlighter .



  7. template < class T> inline T qobject_cast(QObject * object ) { #if !defined(QT_NO_MEMBER_TEMPLATES) && !defined(QT_NO_QOBJECT_CHECK) reinterpret_cast<T>(0)->qt_check_for_QOBJECT_macro(*reinterpret_cast<T>( object )); #endif return static_cast<T>(reinterpret_cast<T>(0)->staticMetaObject.cast( object )); } * This source code was highlighted with Source Code Highlighter .



  8. template < class T> inline T qobject_cast(QObject * object ) { #if !defined(QT_NO_MEMBER_TEMPLATES) && !defined(QT_NO_QOBJECT_CHECK) reinterpret_cast<T>(0)->qt_check_for_QOBJECT_macro(*reinterpret_cast<T>( object )); #endif return static_cast<T>(reinterpret_cast<T>(0)->staticMetaObject.cast( object )); } * This source code was highlighted with Source Code Highlighter .



template < class T> inline T qobject_cast(QObject * object ) { #if !defined(QT_NO_MEMBER_TEMPLATES) && !defined(QT_NO_QOBJECT_CHECK) reinterpret_cast<T>(0)->qt_check_for_QOBJECT_macro(*reinterpret_cast<T>( object )); #endif return static_cast<T>(reinterpret_cast<T>(0)->staticMetaObject.cast( object )); } * This source code was highlighted with Source Code Highlighter .







рддреЛ рдпрд╣рд╛рдБ рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИ:



рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЕрдЧрд░ QT_NO_MEMBER_TEMPLATES рдкрд░рд┐рднрд╛рд╖рд┐рдд рдирд╣реАрдВ рд╣реИ (рдХреЗрд╡рд▓ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ Microsoft Visual Studio рд╕рдВрд╕реНрдХрд░рдг 2002 рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдХрдо рд╣реИ) рдФрд░ QT_NO_QOBJECT_CHECK (рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ 2003 рд╕реЗ рдХрдо Microsoft Visual Studio рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ Q_OBJECT рдореИрдХреНрд░реЛ рдХреЛ рд╡рд░реНрдЧ рдШреЛрд╖рдгрд╛ рдореЗрдВ рдЬрд╛рдБрдЪ рдХреА рдЬрд╛рддреА рд╣реИред рдФрд░ рдЙрд╕рдХреЗ рдмрд╛рдж, рд░реВрдкрд╛рдВрддрд░рдг рд╕реНрд╡рдпрдВ рд╕реАрдзреЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ - рдкрд╣рд▓реЗ рд╣рдореЗрдВ QMetaObject рд╡рд░реНрдЧ рдХреА рдПрдХ рд╕реНрдерд┐рд░ рд╡рд╕реНрддреБ рдорд┐рд▓рддреА рд╣реИ, рдЬрд┐рд╕реЗ staticMetaObject рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдХрд╛рд╕реНрдЯ рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдкрд╛рд╕ рдХреА рдЧрдИ рд╡рд╕реНрддреБ рдХреЗ const_cast рдХреЛ рд▓реМрдЯрд╛рддрд╛ рд╣реИ, рд╕рд╛рде рд╣реА рдЬрд╛рдБрдЪрддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рдСрдмреНрдЬреЗрдХреНрдЯ QObject рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛ рд╣реИред рдЗрд╕рдХреЗ рдмрд╛рдж, рдкрд░рд┐рдгрд╛рдореА рд╡рд╕реНрддреБ рдХреЛ static_cast рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдкрд░рд┐рдгрд╛рдо рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рддрд╛ рд╣реИред



7. рдХреНрд╡реИрд░рд┐рдПрдВрдЯ_рдХрд╛рд╕реНрдЯ



рд╡рд╛рдХреНрдп рд░рдЪрдирд╛:

  TYPE qvariant_cast <TYPE> (const QVariant & value) 




рд╡рд╛рдВрдЫрд┐рдд рд╡рд░реНрдЧ рдХреЗ рд▓рд┐рдП рд╡рд░реНрдЧ QVariant рдХреА рдПрдХ рд╡рд╕реНрддреБ рдХрд╛рд╕реНрдЯ рдХрд░рддрд╛ рд╣реИред рдлрд╝рдВрдХреНрд╢рди qVariantValue рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рдорд╛рди рд╣реИред



рдЕрдВрджрд░ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ рдЗрд╕ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:







  1. рдЯреЗрдореНрдкрд▓реЗрдЯ <рдЯрд╛рдЗрдкрдиреЗрдо рдЯреА> рдЗрдирд▓рд╛рдЗрди рдЯреА рдХреНрд╡реИрд░рд┐рдПрдВрдЯ_рдХрд╛рд╕реНрдЯ (рдХреЙрдиреНрд╕реНрдЯреЗрдВрдЯ QVariant & v)
  2. {
  3. const int vid = qMetaTypeId <T> (static_cast <T *> (0));
  4. рдЕрдЧрд░ (vid == v.userType ())
  5. рд╡рд╛рдкрд╕реА * reinterpret_cast < const T *> (v.constData ());
  6. рдЕрдЧрд░ (vid < int (QMetaType :: рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛)) {
  7. рдЯреА рдЯреА;
  8. рдпрджрд┐ (qvariant_cast_helper (v, QVariant :: рдкреНрд░рдХрд╛рд░ (vid), рдФрд░ t))
  9. рд╡рд╛рдкрд╕реА рдЯреА;
  10. }
  11. рд╡рд╛рдкрд╕реА T ();
  12. }
* рдЗрд╕ рд╕реЛрд░реНрд╕ рдХреЛрдб рдХреЛ рд╕реЛрд░реНрд╕ рдХреЛрдб рд╣рд╛рдЗрд▓рд╛рдЗрдЯрд░ рдХреЗ рд╕рд╛рде рд╣рд╛рдЗрд▓рд╛рдЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред




рдХреЛрдб рдХреЗ рдкрд╣рд▓реЗ рдЦрдВрдб рдореЗрдВ, рдХреНрдпреВрдЯреА рдореЗрдЯрд╛рд╕рд┐рд╕реНрдЯ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╡рд░реНрдЧ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИред рдпрджрд┐ рд╡рд░реНрдЧ Q_DECLARE_METATYPE рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкрдВрдЬреАрдХреГрдд рдирд╣реАрдВ рд╣реИ, рддреЛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рдХрд▓рд╛рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рдХреЛрдб рд╕рдВрдХрд▓рд┐рдд рдХрд░рдиреЗ рд╕реЗ рддреНрд░реБрдЯрд┐ рд╣реЛ рдЬрд╛рдПрдЧреАред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрджрд┐ рдореЗрдЯрд╛рд╕рд┐рд╕реНрдЯрдо рд╕реЗ рдкреНрд░рд╛рдкреНрдд рд╡рд╕реНрддреБ рдХрд╛ рдкреНрд░рдХрд╛рд░ QVariant рдорд╛рди рдореЗрдВ рдЯрд╛рдЗрдк рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ, рддреЛ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреА рд╕рд╛рдордЧреНрд░реА рдХреА reinterpret_cast рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдпрджрд┐ рд╡рд░реНрдЧ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдПрдХ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдкреНрд░рдХрд╛рд░ рдирд╣реАрдВ рд╣реИ рдФрд░ рдЗрд╕рдХреА рдЖрдИрдбреА QVariant рдорд╛рди рдореЗрдВ рдорд╛рди рд╕реЗ рдореЗрд▓ рдирд╣реАрдВ рдЦрд╛рддреА рд╣реИ, рддреЛ TYPE () рд╡рд╛рдкрд╕ рдЖ рдЧрдпрд╛ рд╣реИред рдРрд╕реЗ рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдЬрдм рд╣рдо рдмрд┐рд▓реНрдЯ-рдЗрди рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, qvariant_cast_helper рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдмрджрд▓реЗ рдореЗрдВ рдХрдиреНрд╡рд░реНрдЯ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдкрддрд╛ рд╣реИрдВрдбрд▓рд░ рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реЛрддрд╛ рд╣реИред рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЯрд╛рдЗрдк рдЯрд╛рдЗрдк рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рд╣реИред рдпрджрд┐ рд░реВрдкрд╛рдВрддрд░рдг рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ TYPE () рдСрдмреНрдЬреЗрдХреНрдЯ рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рддрд╛ рд╣реИ



UPD: C- рд╕реНрдЯрд╛рдЗрд▓ рдХрд╛рд╕реНрдЯ рдореВрд▓ рд░реВрдк рд╕реЗ рд╕рдмрд╕реЗ рдзреАрдорд╛ рд░реВрдкрд╛рдВрддрд░рдг рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЙрд▓ рдХреНрд░рдорд┐рдХ рд░реВрдк рд╕реЗ рд╕реНрдХреИрди рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ:





UPD: рд╕рд╛рднрд╛рд░ BaJlepa :

1. const_cast рднреА cv рдХреНрд╡рд╛рд▓рд┐рдлрд╛рдпрд░ рдЬреЛрдбрд╝рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реИ

2. рдкреЙрдЗрдВрдЯрд░реНрд╕ рдХрдиреНрд╡рд░реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд░реАрдЯрд░рдЯрд░рдкреНрд░реЗрдЯ_рдХрд╛рд╕реНрдЯ рдХреЗ рдмрдЬрд╛рдп void * рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдбрдмрд▓ рд╕реНрдЯреЗрдЯрд┐рдХ_рдХрд╛рд╕реНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕ рддрд░рд╣ рдХреЗ рд░реВрдкрд╛рдВрддрд░рдг рд╕реЗ рдЖрдк рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХреЗрд╡рд▓ рдкреЙрдЗрдВрдЯрд░реНрд╕ рдХрд╛рд╕реНрдЯ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ



рд╕реВрддреНрд░реЛрдВ рдХрд╛ рдХрд╣рдирд╛ рд╣реИ:

a) http://alenacpp.blogspot.com/2005/08/c.html

b) http://www.cppreference.com

рдЧ) http://www.cplusplus.com/doc/tutorial/typecasting/

d) http://doc.qt.nokia.com/4.7/qobject.html#qobject_cast

e) http://www2.research.att.com/~bs/bs_faq2.html

рдИ) http://doc.qt.nokia.com/4.7/qvariant.html#qvariant_cast

UPD: g) http://www.rsdn.ru/Forum/Info/FAQ.cpp.c-stylecast.aspx



All Articles