
Hello, I've been using the Boost Range library a lot lately and felt the need for some compile-time concept checks. They're pretty simple to write using the Boost Concept Check library. So, I wrote concept checking classes for the four range concepts mentioned in the documentation. To illustrate their usage, the following checks if a type X models the ForwardRange concept. function_requires<ForwardRangeConcept<X> >(); I've been checking the value access property of the range separately using iterator concept checks on the range's iterator. So, for a ForwardReadableRange ... function_requires<ForwardRangeConcept<X> >(); function_requires< ReadableIteratorConcept< typename range_iterator<X>::type >
();
Implementing the concept checking classes is pretty straight forward using the range documentation. As an example, here's my implementation for BidierctionalRange. template<typename X> struct BidirectionalRangeConcept { typedef typename range_reverse_iterator<X>::type range_reverse_iterator; typedef typename range_const_reverse_iterator<X>::type range_const_reverse_iterator; void constraints() { function_requires<ForwardRangeConcept<X> >(); function_requires< boost_concepts::BidirectionalTraversalConcept< typename range_iterator<X>::type > >(); i = rbegin(a); i = rend(a); const_constraints(a); } void const_constraints(const X& a) { ci = rbegin(a); ci = rend(a); } X a; range_reverse_iterator i; range_const_reverse_iterator ci; }; Anyway, I hope there's enough interest to include concept checks like these in the Boost Range library for a future release. I'd be glad to submit a file containing my implementations. Please, let me know what you think! Thanks, Daniel Walker