
Hi, I read you mail on boost concerning QLang. I just wanted to say I was wondering (not very seriously) how to do such system, and you come with a very clean first try.
Basically it's done with some metaprogramming to get the exact return type of a query. For example, if I put as an argument in a select a pointer to member data, I extract that pointer to member's type and put it in a tuple, without const, volatile and removing the reference. I also use filter_iterator and transform_iterator from boost to filter sequences based on the where lambda. Just a suggestion : it would be great if the user of the qlang could select
a tuple of value as a return value. (let's say I want to select the string member "_name", a copy of the pointeur "this", and an int "_age" for example from a set of objects. I suppose returning a tuple for example (or some other type than those of the members) could be very interesting.
I don't know very well what you mean by returning a tuple of value as a return value. For now, what the libraries does is, if you write: from(somerange).select(full_object); it will return a select_ object which will generate a copy of the full object. if you write: from(somerange).select(&MyStruct::a_, &MyStruct::b_); it will return a select_ object which will return a std::tuple<type of a_ without const and without reference, type of b_ without const and without reference>. Boost.Qlang allows you to return tuples right now, the problem is that those tuples (for now) are just 1-element tuples. But in the future they will be arbitrary tuples. A copy of the this pointer does not make sense I think. Since every piece of data is immutable (data is always generated based on the select arguments), if you want the this pointer, you will have to return full_object (a copy). So you cannot get the this pointer directly. You can manipulate that query and write it back where it belongs if you want to modify some object.