![]() |
Boost.Range |
This library makes it possible to treat different types as if they have
implemented a subset of the container requirements (see §23.1of the C++
standard). Formally, that subset is defined by the Range concept. The subset deals mostly with iterator
returning functions and nested typedef
s. The main goal is to treat
built-in arrays, standard containers, pairs of iterators and some iterators
uniformly.
The main advantages are
Below are given a small example (the complete example can be found here ):
// // Example: extracting bounds in generic algorithms // template< typename XRange, typename T > inline typename boost::iterator_of<XRange>::type find( XRange& c, const T& value ) { return std::find( boost::begin( c ), boost::end( c ), value ); } template< typename XRange, typename T > inline typename boost::const_iterator_of<XRange>::type find( const XRange& c, const T& value ) { return std::find( boost::begin( c ), boost::end( c ), value ); } // // replace first value and return its index // template< typename EC, typename T > inline typename boost::size_type_of< EC >::type my_generic_replace( EC& c, const T& value, const T& replacement ) { typename boost::const_iterator_of<EC>::type found = find( c, value ); *found = replacement; return std::distance( boost::begin( c ), found ); } // // usage // std::vector<int> my_vector; typedef vector<int>::iterator iterator; std::pair<iterator,iterator> my_view( my_vector.begin(), my_vector.begin( ) + N ); char str[] = "a string"; // ... std::cout << my_generic_replace( my_vector, 4, 2 ) << my_generic_replace( my_view, 4, 2 ) << my_generic_replace( str, 'a', 'b' );By using the free-standing functions and type-generators, the code automatically works for all the types supported by this library. Notice that we have to provide two version of
find()
since we cannot forward a non-const
rvalue with reference arguments (see this article about The
Forwarding Problem ).
(C) Copyright Thorsten Ottosen 2003-2004