I'm thinking right now about such a thing too. I decided to use soci, as it is a really good SQL Lib for C++: soci.sourceforge.net My current approach is from the DB side, I'm writing a programm which generates classes from CREATE TABLE statements. I think by next weekend I got a prototype ready. regards, Jens Weller -------- Original-Nachricht --------
Datum: Sat, 28 Feb 2009 11:21:50 -0500 Von: "V S P"
An: boost-users@lists.boost.org Betreff: [Boost-users] [Q] opinion on basic C++ reflection implementation
Hello to be make it easy to read a table from a database and save the result with boost serialization (and to write back back to the database)
I have devised a scheme to achieve C++ reflections that allows me to set a field value and get a field value using a string data member name.
I am using the fact that in C++ functions can take a reference to a class instance and operate on the class data members, where the functions have hardcoded the datamember names. Since those functions can be declared as static, I simply remember the pointer to my getters and setters in static maps associated with every class instance
So when a class instance gets created -- it updates the static maps of getters and setters. I do not like the fact that I have to use a mutex on the function maps.
ANd in general wanted to ask if such approach has been implemented in one of the boost libraries or if not ... why not
I am attaching a 'brief' of the mechanism. Thank you in advance for any feedback.
Vlad -------------------------------------------------------------
struct tField { string name; //other DB-related attributes //order of declaration, isnullable, otltype }
struct reflectable {
//returns a string name of the field char* (*tF_get_field_name)(void),
//assign a value to the field. The value is obtained from functor //that's why we call it 'set' typedef void (*tFset__field)(reflecatble& , CFFunctorAssignVal&) ;
//send the field value (const) to somewhere //that's why we call it 'get' typedef void (*tFget__field)(const reflectable&,CFFunctorReceiveVal&) ;
typedef map
tName2Fields; typedef map tMFset__field; typedef map tMFget__field; //derived classes must have the "static" version of the maps //we inforce it by declaring abstract functions here //also each class will have to provide a static function //that gets returns a pointer to each map };
tempate < typename T, //cpp type tF_get_field_name fname, //function ptr to get name tFset__field assing_functor, //functor pointer to assing val to field tFget__field get_functor, //functor to read val from field
tName2Fields* ptrFieldMap, tMFset__field* ptrSetterMap, tFget__field* ptrGetterMap
struct rffield { //register a field name (obtained from fname() //with ptrFieldMap
//register pointer to getter with ptrGetterMap //register pointer to setter with ptrSetMap
}
---- separate header -----------------
struct myclass: public reflecatble { static allTheMaps...;
//to simplify I have a macro that takes in field name, cpp type //and declares them and generates getter and setter functions //that accept functors
static void field1__getter ( const reflectable&th,CFFunctorReceiveVal& f) { f(th.field1); } static void field1__setter ( const reflectable& th,CFFunctorAssignVal& f) { f(th.field1); }
static const char* field1__name (void) { const char* res="field1"; return res; }
//single declration causes all the registration to take place //since I am passing parameteres to rffield constructor //via template. It is almost like ability to invoke constructor // right in a header file. rffield
field1; }
------------ cpp for my class has the static maps -- ----------- -- V S P toreason@fastmail.fm
-- http://www.fastmail.fm - Faster than the air-speed velocity of an unladen european swallow
_______________________________________________ Boost-users mailing list Boost-users@lists.boost.org http://lists.boost.org/mailman/listinfo.cgi/boost-users
-- Psssst! Schon vom neuen GMX MultiMessenger gehört? Der kann`s mit allen: http://www.gmx.net/de/go/multimessenger01