#include #include #include std::auto_ptr< std::exception> Clone( virtual const std::exception& e); std::auto_ptr< std::exception> Clone_( static const std::exception& e) { return std::auto_ptr< std::exception>( new std::runtime_error( e.what())); } std::auto_ptr< std::exception> Clone_( static const std::runtime_error& e) { return std::auto_ptr< std::exception>( new std::runtime_error( e)); } namespace { std::auto_ptr< std::exception> currentexception; } void Cmm_ExceptionFudge_Throw( const std::exception& e) { currentexception.reset( Clone( e).release()); } void Cmm_ExceptionFudge_Throw() { assert( currentexception.get()); } std::exception* Cmm_ExceptionFudge_Get() { return currentexception.get(); } int main() { try { throw std::runtime_error( "foo"); } catch( std::exception& e) { std::cerr << "received exception: " << e.what() << "\n"; return 1; } return 0; }