// checked_cast - Uses fast static_cast in release build, but checks cast with an assert in debug (or checked) build.
//
// Typical usage:
// class B { /* ... */ };
// class D : public B { /* ... */ };
// B * pb = new D;
// D * pd = checked_cast<D *>(pb);
template <class TTO, class TFROM>
TTO checked_cast(TFROM p)
{
#if defined(DEBUG) || defined(CHECKED_CAST)
	try
	{
		// dynamic cast will return NULL when casting a pointer
		assert(dynamic_cast<TTO>(p));
	}
	catch (std::bad_cast)
	{
		// dynamic_cast will throw when casting a reference
		assert(false);
	}
#endif
	return static_cast<TTO>(p);
}
