![]() |
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 typedefs. 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