FREE Subscription to Dr. Dobb’s Digest: Same Great Content, New Digital Edition
Site Archive (Complete)
C++
Email
Print
Reprint

add to:
Del.icio.us
Digg
Google
Furl
Slashdot
Y! MyWeb
Blink
November 01, 1999

Templates for Efficient Dynamic Type Checking

(Page 2 of 3)
November 1999/Templates for Efficient Dynamic Type Checking/Listing 1

Listing 1: The assert_cast function templates

// cast.h  definitions for assert_cast

#ifndef CAST_H_A2434B93
#define CAST_H_A2434B93

#include <assert.h>

// assert_cast is similar to dynamic_cast; it differs in that 
// (1) RTTI, with its (small) associated cost in executable size 
// and speed, is used only in Debug mode (i.e., when NDEBUG is 
// not #defined), and (2) a bad cast is signalled by raising an 
// assertion, rather than by returning 0 or throwing 
// std::bad_cast.

// for pointers
template<typename Result_ptr, typename Source>
inline Result_ptr assert_cast(Source* pSource)
{
    assert ( static_cast<Result_ptr>(pSource) ==
                 dynamic_cast<Result_ptr>(pSource) );
    return static_cast<Result_ptr>(pSource);
}

// for references
template<typename Result_ref, typename Source>
inline Result_ref assert_cast(Source& rSource)
{
#ifndef NDEBUG
    try
    {
        assert ( &static_cast<Result_ref>(rSource) ==
                    &dynamic_cast<Result_ref>(rSource) );
    }
    catch(...)
    {
        // convert exceptions to assertions to prevent them 
        // from being "handled"
        assert(false);
    }
#endif
    return static_cast<Result_ref>(rSource);
}

#endif  // CAST_H_A2434B93
Previous Page | 1 | 2 | 3 Next Page
RELATED ARTICLES
No Related Articles
TOP 5 ARTICLES
No Top Articles.



MICROSITES
FEATURED TOPIC

ADDITIONAL TOPICS

INFO-LINK