
Thorsten Ottosen wrote:
"Peter Dimov" <pdimov@mmltd.net> wrote in message news:007301c55654$256e3bb0$6401a8c0@pdimov2...
Thorsten Ottosen wrote:
yep, but the latter approach is harder and takes just about twice as much code in C++0x.
Can you elaborate, please?
sure.
as a free-standing function we can say
template< class T > auto begin( MyType<T>&& r ) -> decltype( r.Begin() ) { return r.Begin(); }
And template< class T > auto begin( MyType<T> const && r ) -> decltype( r.Begin() ) { return r.Begin(); } assuming r.Begin() is const-correct, which it isn't in your example. You also forgot the end() overload. It's debatable whether non-const MyType rvalues should be mutably-iteratable, so we might prefer & instead of && in the above.
for( const auto& r : my_obj ) { ... }
with an adapter class we need to say...
With an adapter we need to say template<class T> std::range<T*> adapt( MyType<T> & r ) { return std::range<T*>( r.Begin(), r.End() ); } template<class T> std::range<T const *> adapt( MyType<T> const & r ) { return std::range<T const *>( r.Begin(), r.End() ); } for( auto & r: adapt( my_obj ) ) { // ... } which is twice as short, not twice as long. One can argue that this is offset by the need to write adapt(), of course.