Listing 3: Definition of class variant2_t
// This variant holds the copy of the original value in // an object of a class specially designed to ensure proper copy // and conversion. class variant2_t { public : variant2_t() : data ( NULL ) {} ~variant2_t() { delete data; } template<typename T> variant2_t ( T v ) :data(new Impl<T>(v)) {} template<typename T> operator T () const { return * CastFromBase<T>(data); } private : struct ImplBase { virtual ~ImplBase() {} } ; template<typename T> struct Impl : ImplBase { Impl ( T v ) : data ( v ) {} T data ; } ; template<typename T> Impl<T>* CastFromBase(ImplBase* v) { Impl<T>* p = dynamic_cast<Impl<T>*>(v); if ( p == NULL ) throw invalid_argument ( typeid(T).name() + string(" is not a valid type") ) ; return p ; } ImplBase* data ; } ; // usage: variant2_t _int( 2 ) ; variant2_t _dbl( 3.14 ) ; variant2_t _str( string( "Hellow")); cout << (int) _int << endl ; cout << (double)_dbl << endl ; cout << (string&)_str << endl ;