//--------------------------------------------------------------------------- /* チェック付き動的型変換 by Gimite checked_cast: ポインタのdynamic_castだが、キャストに失敗するとstd::bad_cast例外 を発生する。 assert_cast: デバッグ時はchecked_cast、リリース時はstatic_castとして働く。 デバッグ時は_DEBUGをdefineしておく必要がある。 ex. Base* pb= ... Derived* pd= checked_cast(pb); */ //--------------------------------------------------------------------------- #ifndef GIMITE_checked_castH #define GIMITE_checked_castH //--------------------------------------------------------------------------- #include //--------------------------------------------------------------------------- namespace gimite{ //--------------------------------------------------------------------------- template inline const T1 checked_cast(T2 src){ T1 dist= dynamic_cast(src); if (src && !dist) throw std::bad_cast(); return dist; } //--------------------------------------------------------------------------- #ifdef _DEBUG template inline const T1 assert_cast(T2 src){ return checked_cast(src); } #else template inline const T1 assert_cast(T2 src){ return static_cast(src); } #endif //--------------------------------------------------------------------------- }//namespace gimite //--------------------------------------------------------------------------- #endif