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