i think i am approaching something interesting
this all works quite nicely imo:
Code:
//metaObject.h
#ifndef metaObjectH
#define metaObjectH
#include <vector>
#include "tmember.h"
class member;
class metaObject
{
friend class member;
private:
std::vector<member*>members;
public:
template<typename H,typename T>metaObject(typelist<H,T> t)
{
tmembers<typelist<H,T> >(*this);
}
template<typename T> void get(unsigned int index,T& lvalue)
{
tmembers<T>* tm =static_cast<tmembers<T> *>(members[index]);
lvalue = *tm->value;
}
template<typename T> void set(unsigned int index,T* rvalue)
{
tmembers<T>* tm =static_cast<tmembers<T> *>(members[index]);
tm->value=rvalue;
}
};
//---------------------------------------------------------------------------
#endif
Code:
//tmember.h
#ifndef tmemberH
#define tmemberH
#include "member.h"
#include "typelist.h"
template<typename T>class tmembers : public member
{
friend class metaObject;
protected:
tmembers(metaObject& obj):
member(obj)
{
}
tmembers(){}
T* value;
};
template<typename H,typename T>class tmembers< typelist<H,T> >:
public virtual tmembers<H>,
public virtual tmembers<T>
{
friend class metaObject;
protected:
tmembers(metaObject &obj):
member(obj),
tmembers<H>(obj),
tmembers<T>(obj)
{
}
};
template<typename H>class tmembers< typelist<H,end> > :
public virtual member,
public virtual tmembers<H>
{
friend class metaObject;
protected:
tmembers(metaObject &obj):
tmembers<H>(obj)
{
}
tmembers(){}
};
template<>class tmembers< end >
{
friend class metaObject;
protected:
tmembers()
{
}
};
//---------------------------------------------------------------------------
#endif
Code:
//member.h
#ifndef memberH
#define memberH
//---------------------------------------------------------------------------
class metaObject;
class member
{
protected:
member(metaObject &obj);
member(){};
};
#endif
Code:
//member.cpp
#include "metaObject.h"
#pragma hdrstop
#include "member.h"
//---------------------------------------------------------------------------
member::member(metaObject &obj)
{
obj.members.push_back(this);
}
Code:
#include "metaObject.h"
int main(int argc, char* argv[])
{
metaObject *o = new metaObject(types<int,double,char>::type());
int *d=new int(1);
int d2(0);
o->set(1,d);
o->get(1,d2);
*d=0;
o->get(1,d2);
return 0;
}
if you try to get or set with an incompatible type, you get a compile time error.
however, what i really wanted to do was this:
Code:
class member;
class metaObject
{
friend class member;
private:
std::vector<member*>members;
public:
template<typename H,typename T>metaObject(typelist<H,T> t,...)
{
va_list ap;
tmembers<typelist<H,T> >(*this,ap);
va_end(ap);
}
template<typename T> void get(unsigned int index,T& lvalue)
{
tmembers<T>* tm =static_cast<tmembers<T> *>(members[index]);
lvalue = *tm->value;
}
template<typename T> void set(unsigned int index,T* rvalue)
{
tmembers<T>* tm =static_cast<tmembers<T> *>(members[index]);
tm->value=rvalue;
}
};
...
//---------------------------------------------------------------------------
#ifndef tmemberH
#define tmemberH
#include <stdarg>
#include "member.h"
#include "typelist.h"
template<typename T>class tmembers : public member
{
friend class metaObject;
protected:
tmembers(metaObject& obj,va_list ap):
member(obj),
value(va_arg(ap,T))
{
}
tmembers(){}
T value;
};
template<typename H,typename T>class tmembers< typelist<H,T> >:
public virtual tmembers<H>,
public virtual tmembers<T>
{
friend class metaObject;
protected:
tmembers(metaObject& obj,va_list ap):
member(obj),
tmembers<H>(obj,ap),
tmembers<T>(obj,ap)
{
}
};
template<typename H>class tmembers< typelist<H,end> > :
public virtual member,
public virtual tmembers<H>
{
friend class metaObject;
protected:
tmembers(metaObject& obj,va_list ap):
member(obj),
tmembers<H>(obj,ap)
{
}
tmembers(){}
};
template<>class tmembers< end >
{
friend class metaObject;
protected:
tmembers()
{
}
};
//---------------------------------------------------------------------------
#endif
however, this:
Code:
metaObject *o = new metaObject(types<int,double,char>::type(),1,1.234,'a');
begets this:
[C++ Error] Unit1.cpp(11): E2285 Could not find a match for 'metaObject::metaObject(typelist<int,typelist<doub le,typelist<char,end> > >,int,double,char)'
is the only other alternative to instantiate the variables inside types?