Hi, here is the code, pls see the Blob type below and it behaves
strangely when created on heap and stack


// ====================================================

#include <stdio.h>

struct NullType
{};

template <class T1, class T2>
struct TypeList
{
        typedef T1 head;
        typedef T2 tail;
};


template <class T1>
struct Blob
{
        Blob(){ p_ = NULL; printf("Blob() child\n"); }
        T1* p_;

};



template <>
struct Blob<NullType>
{};

template <class T1, class T2>
struct Blob<TypeList<T1, T2> > :
public Blob<T1>,
public Blob<T2>
{
        Blob(){ printf("Blob() typelist\n"); }
};




struct A{};
struct B{};
struct C{};

typedef Blob< TypeList <A, TypeList<B, TypeList<C, NullType> > > > myBlob;

typedef TypeList <A, TypeList<B, TypeList<C, NullType> > >  myTypeList;

int main()
{

        printf("1 ====\n");
        myBlob m;
        (static_cast< Blob<A> >(m)).p_ = new A;
        (static_cast< Blob<B> >(m)).p_ = NULL;
        (static_cast< Blob<C> >(m)).p_ = NULL;

        
        if ((static_cast< Blob<A> >(m)).p_ )
                printf("A ok\n");

        if ((static_cast< Blob<B> >(m)).p_ )
                printf("B ok\n");

        printf("2 ====\n");
        myBlob* p = new myBlob;
        (static_cast< Blob<A>* >(p))->p_ = new A;
        (static_cast< Blob<B>* >(p))->p_ = NULL;
        (static_cast< Blob<C>* >(p))->p_ = NULL;
        if ((static_cast< Blob<A>* >(p))->p_ )
                printf("A ok\n");

        if ((static_cast< Blob<B>* >(p))->p_ )
                printf("B ok\n");

        return 0;

}



// ====================================================


what is done is
1) create myBlob on stack and assign its data members to NULL, set A
ptr to a new obj

2) create myBlob on heap and assign its data members to NULL, set A
ptr to a new obj
 
But when the assigned values are inspected, only 2) indicates that
values were assigned.


This is pretty strange. Can u pls point out whats wrong here?
(compiler gcc)

As some background, the Blob creates 'p_' ptrs of  all types in
myTypeList by inheriting from each. Data member is created in a
specialization.


Thanks

Indika



Reply via email to