Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
Разработка программного обеспечения

Method 3.2: Implement a Range Adaptor with arguments

Boost , Chapter 1. Range 2.0 , Method 3: provide range adaptor implementations

Boost C++ Libraries Home Libraries People FAQ More

PrevUpHomeNext
  1. Предоставьте диапазон для вашего типа возврата, например:<
    #include<boost/range/adaptor/argument_fwd.hpp>
    #include<boost/range/iterator_range.hpp>
    #include<boost/iterator/transform_iterator.hpp>
    template<typenameValue>
    classreplace_value
    {
    public:
       typedefconstValue&result_type;
       typedefconstValue&argument_type;
       replace_value(constValue&from,constValue&to)
           :m_from(from),m_to(to)
       {
       }
       constValue&operator()(constValue&x)const
       {
           return(x==m_from)?m_to:x;
       }
    private:
       Valuem_from;
       Valuem_to;
    };
    template<typenameRange>
    classreplace_range
    :publicboost::iterator_range<
       boost::transform_iterator<
           replace_value<typenameboost::range_value<Range>::type>,
           typenameboost::range_iterator<Range>::type>>
    {
    private:
       typedeftypenameboost::range_value<Range>::typevalue_type;
       typedeftypenameboost::range_iterator<Range>::typeiterator_base;
       typedefreplace_value<value_type>Fn;
       typedefboost::transform_iterator<Fn,iterator_base>replaced_iterator;
       typedefboost::iterator_range<replaced_iterator>base_t;
    public:
       replace_range(Range&rng,value_typefrom,value_typeto)
           :base_t(replaced_iterator(boost::begin(rng),Fn(from,to)),
                    replaced_iterator(boost::end(rng),Fn(from,to)))
        {
        }
    };
    
    >
  2. Внедрите класс держателя для хранения аргументов, необходимых для построения RangeAdaptor. Держатель объединяет несколько параметров в один, который может быть передан в качестве правильного операнда<operator|()>.<
    template<typenameT>
    classreplace_holder:publicboost::range_detail::holder2<T>
    {
    public:
       replace_holder(constT&from,constT&to)
           :boost::range_detail::holder2<T>(from,to)
       {}
    private:
       voidoperator=(constreplace_holder&);
    };
    
    >
  3. Определить экземпляр держателя с именем адаптера<
    staticboost::range_detail::forwarder2<replace_holder>
    replaced=boost::range_detail::forwarder2<replace_holder>();
    
    >
  4. определять<operator|><
    template<typenameSinglePassRange>
    inlinereplace_range<SinglePassRange>
    operator|(SinglePassRange&rng,
             constreplace_holder<typenameboost::range_value<SinglePassRange>::type>&f)
    {
       returnreplace_range<SinglePassRange>(rng,f.val1,f.val2);
    }
    template<typenameSinglePassRange>
    inlinereplace_range<constSinglePassRange>
    operator|(constSinglePassRange&rng,
             constreplace_holder<typenameboost::range_value<SinglePassRange>::type>&f)
    {
       returnreplace_range<constSinglePassRange>(rng,f.val1,f.val2);
    }
    
    >

PrevUpHomeNext

Статья 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 ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-30 11:47:00
2025-07-05 03:48:25/0.0040309429168701/0