
Macros are useful tools - you only have to look at Boost.PreProcessor to see how powerful it can be! However, macros/preprocessor sould be, wherever possible, restricted to implementation (like Boost.Function).
I think the solution is to provide both syntaxes. Macro-haters can write typedef relational::row< unique<int>, indexed<std::string> > Person; enum { person_id, person_name }; table<Person> people; select(people, col<person_name>() == "Reece"); while people who don't mind macros can write RM_DEFINE_ROW(Person, unique<int>, id, indexed<std::string>, name); table<Person> people; select(people, people.name == "Reece"); It seems pretty clear that there are varying tastes, so the only solution is to provide both. The notation provided first was the original approach that RML used, and was free from macros, so it would not be too much trouble to put that code back in. I will do that in the next release of RML (which will probably be a couple of weeks as I collate feedback). Thanks all for the feedback, keep it coming, Calum