
"John Torjo" wrote:
Vladimir Prus wrote:
2. A mechanism to iterate over elements of composite type. After some
though,
I believe that the mechanism should be boost::serializaton.
This sounds nice, but I don't know how achievable it is. Basically, when writing a composite type, you might want to write things in-between. Like, for a pair, you might want to write: [first, second] or <<first | second>> (where first and second are the members of the pair)
Same goes for each composite type.
Here's the kind of approach I was pursuing to allow composite types to represent their structure. It's a bit bulky, but quite general. template<typename T> struct is_composite { static const bool value = false; }; For a user-defined Dog class: template<> struct is_composite<Dog> : composite_type< Dog, element_by_functor<NameTag, Dog, std::string, DogNameGetter>, element_by_field<WeightTag, Dog, float, &Dog::weight_>, ... > { }; ( Macros could make this easier: BEGIN_COMPOSITE_TYPE(Dog) ADD_FUNCTOR_ELEMENT(std::string, DogNameGetter); ... END_COMPOSITE_TYPE(Dog); ) This information could be extracted by a Dog-formatter as follows: out << "[Dog: " << get_element<NameTag>(d) << "]"; Or if we assume the order of fields is known: out << "[Dog: " << get<0>(d) << "]"; Jonathan