MACE
1.0.0
|
Dynamic runtime access to fields of reflected classes. More...
Given a reflected type, mace::reflect::value, mace::reflect::value_ref, and mace::reflect::value_cref provide dynamic runtime querying of the members on the type. This is an ideal replacement for void* or even boost::any.
struct contact { contact( const std::string& f, const std::string& l, int z ) :first_name(f),last_name(l),zip(z){} std::string first_name; std::string last_name; int zip; }; struct address_book { std::string name; bool is_locked; std::vector<contact> contacts; }; MACE_REFLECT( contact, (first_name)(last_name)(zip) ) MACE_REFLECT( address_book, (name)(is_locked)(contacts) )
address_book ab; ab.name = "My Address Book"; ab.is_locked = false; ab.contacts.push_back( contact( "Steve", "Jobs", 90210 ) ); ab.contacts.push_back( contact( "Bill", "Gates", 10000 ) ); // store a generic reference to the address book reflect::value_ref v(ab); // access sub members ab["is_locked"].as<int>(); // 0 ab["is_locked"].as<std::string>(); // "false" ab["is_locked"].as<address_book>(); // throws bad_value_cast // store a generic const reference to the address book reflect::value_cref cv(ab); // create a copy of ab, like boost::any, except you can still query and access methods. reflect::value cv(ab); std::cerr<< v["contacts"][0]["first_name"].as<std::string>() <<std::endl; // print Steve v["contacts"][0]["first_name"].set_as( std::string( "New Name" ) ); BOOST_ASSERT( ab.contacts[0].first_name == "New Name" );
You can use convert a reflect::value to json with the following code: