
Hi, this is not a review, and there won't be one because I'm not "knowledgable about the problem domain", but some some quick comments about the traits classes after reading the design rationale and looking at some code. - first of all, I'm curious why you chose to use one traits class for each "agnosticism". this differs from the standard library, so I guess there is a specific reason for it? e.g. std::iterator_traits defines iterator_category, pointer, reference and so on. the equivalent in a GGI Point concept is tag, coordinate, dimension..., which are defined in 5 different traits classes. - is there a default implementation of the traits classes? I haven't found one in code/coordinate_dimension. this would simplify writing concept models in many cases, especially with 5 different traits for a Point. e.g., the iterator_traits default implementation looks like this: template<typename _Iterator> struct iterator_traits { typedef typename _Iterator::iterator_category iterator_category; typedef typename _Iterator::value_type value_type; typedef typename _Iterator::difference_type difference_type; typedef typename _Iterator::pointer pointer; typedef typename _Iterator::reference reference; }; - on a minor note, tag<> seems a little non-descriptive, compared to iterator_category in the STL. Boost.Iostreams and Boost.PropertyMap both use "category", which might also be suitable for GGI, since it has its own namespace and there are no other categories I assume.