
I'm working on Boost.Reflection - see http://boost-extension.blogspot.com. I gave a presentation on it at BoostCon this year. Jeremy Pack On Fri, Oct 31, 2008 at 9:20 PM, Jean-Louis Leroy <jl@yorel.be> wrote:
Is runtime reflection going to be available in boost soon? The last I have found on the subject is http://lists.boost.org/Archives/boost/2007/08/126006.php but I see nothing in the sandbox nor the vault.
I have toyed with an implementation myself. It supports member variables and functions, multiple and virtual inheritance and object creation.
Here is what it looks like.
First a small hierarchy:
class animal { /* ... */ }; class mammal : public virtual animal { /* ... */ }; class carnivore : public virtual animal{ /* ... */ }; class dog : public mammal, public carnivore{ /* ... */ };
Reflection info is filled like this:
reflection_class<animal>::name("animal"); reflection_class<animal>::variable("age", &animal::age); // etc
reflection_class<mammal>::name("mammal"); reflection_class<mammal>::base<animal>(virtual_); // etc
reflection_class<carnivore>::name("carnivore"); reflection_class<carnivore>::base<animal>(virtual_); // etc
reflection_class<dog>::name("dog"); reflection_class<dog>::base<mammal>(); reflection_class<dog>::base<carnivore>(); // a function reflection_class<dog>::function("bark", &dog::bark); // overloaded functions reflection_class<dog>::function<string (dog::*)(void) const>("name", &dog::name); reflection_class<dog>::function<void (dog::*)(const string&)>("name", &dog::name); // constructor reflection_class<dog>::constructor<void* (*)()>(); // etc
And here how it's used:
animal* pa(new dog);
object o(downcast(pa)); // recover dynamic type
// access member variable inherited from virtual base `animal' member_variable<int> dog_age(o, "age"); int age = o[dog_age];
// call member function member_function<string (object::*)() const> dog_name(o, "name"); string name = o[dog_name]();
// create a dog using default ctor object o("dog");
Ok, there is a bit more to it (e.g. support macros, ambiguity detection, handling of shadowed members, overloaded ctors) but the important part is shown above. All in all it is a foundation upon which one can build multimethods, generic object processing (like Perl's data::Dumper), serialization, object-relational mapping and all sorts of nice tools.
Does anybody see interest in this work?
Jean-Louis _______________________________________________ Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost