Listing 2: Template class workarounds for compiler template argument deduction and overload resolution problems
// alt_cast.h definitions for assert_cast (workarounds for // certain compilers) #ifndef CAST_H_A2434B93 #define CAST_H_A2434B93 #include <assert.h> // declare general version template<typename Result> class assert_cast; // define specialization for pointers template<typename Result> class assert_cast<Result*> { public: template<typename Source> assert_cast(Source* pSource) : m_pResult( static_cast<Result*>(pSource) ) { assert ( m_pResult == dynamic_cast<Result*>(pSource) ); } operator Result*() const { return m_pResult; } private: Result* m_pResult; }; // define specialization for references template<typename Result> class assert_cast<Result&> { public: template<typename Source> assert_cast(Source& rSource) : m_rResult( static_cast<Result&>(rSource) ) { assert( &m_rResult ); assert( &m_rResult == dynamic_cast<Result*>(&rSource) ); } operator Result&() const { return m_rResult; } private: Result& m_rResult; }; #endif // CAST_H_A2434B93