Boost logo

Boost :

From: E. Gladyshev (egladysh_at_[hidden])
Date: 2003-10-04 04:12:20


Just wondering does boost have something similar to C unions
so that you could create heterogenious containers?

Something like the following working pseudo-code

template < typename Types >
struct union2
{
    typedef typename boost::mpl::at_c<Types, 0 >::type type1;
    typedef typename boost::mpl::at_c<Types, 1 >::type type2;
    
    union2() : obj_(0)
    {
    }
    union2( const union2<Types>& l ) : obj_(0)
    {
        create( l.t_ );
        copy( l.obj_ );
    }
    virtual ~union2()
    {
        free();
    }
    
    void create( size_t t )
    {
        free();
        t_ = t;
        switch( t_ )
        {
        case 0:
            obj_ = new type1;
            break;
            
        case 1:
            obj_ = new type2;
            break;
            
        default:
            throw;
        }
    }
    
private:
    size_t t_;
    void *obj_;
    void free()
    {
        if( !obj_ ) return;
        switch( t_ )
        {
        case 0:
            delete static_cast<type1*>(obj_);
            break;
            
        case 1:
            delete static_cast<type2*>(obj_);
            break;
            
        default:
            throw;
        }
        obj_ = 0;
    }
    
    void copy( void* obj )
    {
        switch( t_ )
        {
        case 0:
            *static_cast<type1*>(obj_) = *static_cast<type1*>(obj);
            break;
            
        case 1:
            *static_cast<type2*>(obj_) = *static_cast<type2*>(obj);
            break;
            
        default:
            throw;
        }
    }
};

main()
{
  typedef notus::union2< boost::mpl::vector2<char, short> > my_union;

  std::vector< my_union > gv;
        
  my_union u(0);
  my_union u1(1);
  gv.push_back( u );
  gv.push_back( u1 );
}

Eugene

__________________________________
Do you Yahoo!?
The New Yahoo! Shopping - with improved product search
http://shopping.yahoo.com


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk