Method 3.2: Implement a Range Adaptor with arguments
Предоставьте диапазон для вашего типа возврата, например:<#include < boost / range / adaptor / argument_fwd . hpp >
#include < boost / range / iterator_range . hpp >
#include < boost / iterator / transform_iterator . hpp >
template < typename Value >
class replace_value
{
public :
typedef const Value & result_type ;
typedef const Value & argument_type ;
replace_value ( const Value & from , const Value & to )
: m_from ( from ), m_to ( to )
{
}
const Value & operator ()( const Value & x ) const
{
return ( x == m_from ) ? m_to : x ;
}
private :
Value m_from ;
Value m_to ;
};
template < typename Range >
class replace_range
: public boost :: iterator_range <
boost :: transform_iterator <
replace_value < typename boost :: range_value < Range >:: type >,
typename boost :: range_iterator < Range >:: type > >
{
private :
typedef typename boost :: range_value < Range >:: type value_type ;
typedef typename boost :: range_iterator < Range >:: type iterator_base ;
typedef replace_value < value_type > Fn ;
typedef boost :: transform_iterator < Fn , iterator_base > replaced_iterator ;
typedef boost :: iterator_range < replaced_iterator > base_t ;
public :
replace_range ( Range & rng , value_type from , value_type to )
: base_t ( replaced_iterator ( boost :: begin ( rng ), Fn ( from , to )),
replaced_iterator ( boost :: end ( rng ), Fn ( from , to )))
{
}
};
>
Внедрите класс держателя для хранения аргументов, необходимых для построения RangeAdaptor. Держатель объединяет несколько параметров в один, который может быть передан в качестве правильного операнда<operator |()
>.<template < typename T >
class replace_holder : public boost :: range_detail :: holder2 < T >
{
public :
replace_holder ( const T & from , const T & to )
: boost :: range_detail :: holder2 < T >( from , to )
{ }
private :
void operator =( const replace_holder &);
};
>
Определить экземпляр держателя с именем адаптера<static boost :: range_detail :: forwarder2 < replace_holder >
replaced = boost :: range_detail :: forwarder2 < replace_holder >();
>
определять<operator |
><template < typename SinglePassRange >
inline replace_range < SinglePassRange >
operator |( SinglePassRange & rng ,
const replace_holder < typename boost :: range_value < SinglePassRange >:: type >& f )
{
return replace_range < SinglePassRange >( rng , f . val1 , f . val2 );
}
template < typename SinglePassRange >
inline replace_range < const SinglePassRange >
operator |( const SinglePassRange & rng ,
const replace_holder < typename boost :: range_value < SinglePassRange >:: type >& f )
{
return replace_range < const SinglePassRange >( rng , f . val1 , f . val2 );
}
>
Статья Method 3.2: Implement a Range Adaptor with arguments раздела Chapter 1. Range 2.0 Method 3: provide range adaptor implementations может быть полезна для разработчиков на c++ и boost.
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.
:: Главная :: Method 3: provide range adaptor implementations ::