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
October 01, 2000

An Improved Variant Type Based on Member Templates

(Page 4 of 8)
October 2000/An Improved Variant Type Based on Member Templates/Listing 3

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 ;

Previous Page | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 Next Page
RELATED ARTICLES
No Related Articles
TOP 5 ARTICLES
No Top Articles.



MICROSITES
FEATURED TOPIC

ADDITIONAL TOPICS

INFO-LINK