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

type_erased

Boost , Chapter 1. Range 2.0 , Reference

Boost C++ LibrariesHomeLibrariesPeopleFAQMore

PrevUpHomeNext

Синтаксис

Код

Труба

<rng| boost::adaptors::type_erased<Value, Traversal, Reference, Difference, Buffer>()>

Функция

<boost::adaptors::type_erase(rng, boost::adaptors::type_erased<Value, Traversal, Reference, Difference, Buffer>)>

Обратите внимание, что часто нет необходимости использовать адаптер<type_erased>. Часто лучше использовать неявное преобразование в<any_range>.

Пусть<Rng>будет тип<rng>.

  • Шаблоны параметров:
    • <Value>является<value_type>для<any_range>. Если это настроено на повышение::use_default,<Value>будет вычисляться из типа диапазона при нанесении адаптера.
    • <Traversal>- это метка, используемая для идентификации прохождения результирующего диапазона. Часто желательно установить категорию обхода ниже, чем исходный контейнер или диапазон, чтобы максимизировать количество диапазонов, которые могут быть преобразованы в<any_range>. Если это будет сделано, то<Traversal>будет<typenameboost::iterator_traversal<boost::range_iterator<Rng>::type>::type>.
    • <Reference>это<reference>для<any_range><boost::use_default>приравнивается к<typenamerange_reference<Rng>::type>.
    • <Difference>—<difference_type>для любого диапазона.<boost::use_default>приравнивается к<typename boost::range_difference<Rng>::type>.
    • <Buffer>является хранилищем, используемым для выделения основных оберток итератора. Обычно это можно игнорировать, но доступно в качестве параметра шаблона для настройки. Буфер должен быть образцом<AnyIteratorBufferConcept>.
  • Предварительное условие:<Traversal>является одним из<{boost::use_default,boost::single_pass_traversal_tag,boost::forward_traversal_tag,boost::bidirectional_traversal_tag,boost::random_access_traversal_tag }>.
  • Возвращение:Возвратное значение равно<typenameany_range_type_generator<Rng,Value,Traversal,Reference,Difference,Buffer >>, которое представляет<rng>в стертом виде.
  • Категория диапазона:Одиночный проход
  • Возвращенная категория диапазона:, если<Traversal>было указано как<boost::use_default>, то<typenameboost::iterator_traversal<boost::range_iterator<Rng>::type>::type>, в противном случае<Traversal>.
AnyIteratorBufferConcept

class AnyIteratorBufferConcept
{
public:
    AnyIteratorBufferConcept();
    ~AnyIteratorBufferConcept();
    // bytes is the requested size to allocate. This function
    // must return a pointer to an adequate area of memory.
    // throws: bad_alloc
    //
    // The buffer will only ever have zero or one
    // outstanding memory allocations.
    void* allocate(std::size_t bytes);
    // deallocate this buffer
    void deallocate();
};

#include <boost/range/adaptor/type_erased.hpp>
#include <boost/range/algorithm/copy.hpp>
#include <boost/assign.hpp>
#include <boost/foreach.hpp>
#include <iterator>
#include <iostream>
#include <list>
#include <vector>
// The client interface from an OO perspective merely requires a sequence
// of integers that can be forward traversed
typedef boost::any_range<
    int
  , boost::forward_traversal_tag
  , int
  , std::ptrdiff_t
> integer_range;
namespace server
{
    void display_integers(const integer_range& rng)
    {
        boost::copy(rng,
                    std::ostream_iterator<int>(std::cout, ","));
        std::cout << std::endl;
    }
}
namespace client
{
    void run()
    {
        using namespace boost::assign;
        using namespace boost::adaptors;
        // Under most conditions one would simply use an appropriate
        // any_range as a function parameter. The type_erased adaptor
        // is often superfluous. However because the type_erased
        // adaptor is applied to a range, we can use default template
        // arguments that are generated in conjunction with the
        // range type to which we are applying the adaptor.
        std::vector<int> input;
        input += 1,2,3,4,5;
        // Note that this call is to a non-template function
        server::display_integers(input);
        std::list<int> input2;
        input2 += 6,7,8,9,10;
        // Note that this call is to the same non-tempate function
        server::display_integers(input2);
        input2.clear();
        input2 += 11,12,13,14,15;
        // Calling using the adaptor looks like this:
        // Notice that here I have a type_erased that would be a
        // bidirectional_traversal_tag, but this is convertible
        // to the forward_traversal_tag equivalent hence this
        // works.
        server::display_integers(input2 | type_erased<>());
        // However we may simply wish to define an adaptor that
        // takes a range and makes it into an appropriate
        // forward_traversal any_range...
        typedef boost::adaptors::type_erased<
            boost::use_default
          , boost::forward_traversal_tag
        > type_erased_forward;
        // This adaptor can turn other containers with different
        // value_types and reference_types into the appropriate
        // any_range.
        server::display_integers(input2 | type_erased_forward());
    }
}
int main(int argc, const char* argv[])
{
    client::run();
    return 0;
}

Это позволит получить результат:

1,2,3,4,5,
6,7,8,9,10,
11,12,13,14,15,
11,12,13,14,15,


PrevUpHomeNext

Статья type_erased раздела Chapter 1. Range 2.0 Reference может быть полезна для разработчиков на c++ и boost.




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.



:: Главная :: Reference ::


реклама


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

Время компиляции файла: 2024-08-30 11:47:00
2025-05-19 20:30:49/0.010155200958252/1