Этот класс представляет собой C++03-совместимую реализацию std::scoped_allocator_adaptor. Шаблон классаscoped_allocator_adaptor- шаблон распределителя, который определяет ресурс памяти (внешний распределитель), который будет использоваться контейнером (как и любой другой распределитель), а также определяет внутренний ресурс распределителя, который будет передан конструктору каждого элемента в контейнере.
Этот адаптер инстанцируется одним внешним и нулевым или более внутренним типами распределителей. Если аллокатор имеет только один тип, то внутренний аллокатор становитсяscoped_allocator_adaptor., используя, таким образом, один и тот же ресурс распределения для контейнера и каждого элемента внутри контейнера и, если сами элементы являются контейнерами, каждый из их элементов рекурсивно. При наличии более чем одного распределителя первый распределитель является внешним распределителем для использования контейнером, второй распределитель передается конструкторам элементов контейнера, а если сами элементы являются контейнерами, третий распределитель передается элементам элементов и так далее. Если контейнеры вложены на глубину, превышающую количество распределителей, последний распределитель используется повторно, как в случае с одним распределителем, для любых оставшихся рекурсий.
[править]Примечание:scoped_allocator_adaptorявляется производным от типа внешнего распределителя, поэтому он может быть заменен на тип внешнего распределителя в большинстве выражений. - конец примечания
В функциях члена конструкции<OUTERMOST(x)>является x, если x не имеет<outer_allocator()>функции члена и<OUTERMOST(x.outer_allocator())>в противном случае;<OUTERMOST_ALLOC_TRAITS(x)>является<allocator_traits<decltype(OUTERMOST(x))>>.
Примечание:<OUTERMOST(x)>и<OUTERMOST_ALLOC_TRAITS(x)>являются рекурсивными операциями. В соответствии с определением<outer_allocator()>рекурсия прекращается. Он завершится для всех инстанциацийscoped_allocator_adaptor. - конец примечания
Тип: Тип с постоянным булевым<value>== истинно, если<allocator_traits<Allocator>:: propagate_on_container_copy_assignment::value>истинно для любого<Allocator>в наборе<OuterAlloc>и<InnerAllocs...>, ложно иначе.
Тип: Тип с постоянным булевым<value>== истинно, если<allocator_traits<Allocator>:: propagate_on_container_move_assignment::value>истинно для любого<Allocator>в наборе<OuterAlloc>и<InnerAllocs...>, ложно иначе.
Тип: Тип с постоянным булевым<value>== истинно, если<allocator_traits<Allocator>:: propagate_on_container_swap::value>истинно для любого<Allocator>в наборе<OuterAlloc>и<InnerAllocs...>, ложно иначе.
typedefbase_type::is_always_equalis_always_equal;
Тип: Тип с постоянным булевым<value>== истинно, если<allocator_traits<Allocator>:: is_always_equal::value>истинно для всех<Allocator>в наборе<OuterAlloc>и<InnerAllocs...>, ложно иначе.
scoped_allocator_adaptor
public
construct/copy/destruct
<
scoped_allocator_adaptor();
>
Эффекты: значение инициализирует базовый класс OuterAlloc и объект внутреннего распределителя.
Эффекты: инициализирует базовый класс OuterAlloc с повышением::forward(outerAlloc) и внутренний с внутренними Allocs... (отсюда рекурсивно инициализирует каждый распределитель внутри адаптера с соответствующим распределителем из списка аргументов).
Возвращение: Новый<scoped_allocator_adaptor>объект, где каждый распределитель в адаптере инициализируется из результата вызова<allocator_traits<Allocator>::select_on_container_copy_construction()>на соответствующий распределитель в *это.
2) В противном случае, если<uses_allocator<T, inner_allocator_type>::value>истинно и<is_constructible<T, allocator_arg_t, inner_allocator_type, Args...>:: value>истинно, вызывает<OUTERMOST_ALLOC_TRAITS(*this):: construct(OUTERMOST(*this), p, allocator_arg, inner_allocator(), std::forward<Args>(args)...)>
Примечание: В компиляторах без расширенной поддержки деклотипа SFINAE<is_constructible>не может быть реализовано так, что условие будет заменено конструктором_with_allocator_prefix::value. - конец примечания]
3) В противном случае, если используется_allocator::value is true and<is_constructible<T, Args..., inner_allocator_type>:: value>is true, вызывает<OUTERMOST_ALLOC_TRAITS(*this):: construct(OUTERMOST(*this), p, std::forward<Args>(args)..., inner_allocator())>.
Примечание: В компиляторах без расширенной поддержки SFINAE<is_constructible>не может быть реализовано так, чтобы условие было заменено<constructible_with_allocator_suffix<T>:: value>. - конец примечания]
4) В противном случае программа является плохо сформированной.
Примечание: Ошибка возникает, если<uses_allocator>оценивает истинность, но конкретный конструктор не принимает распределителя. Это определение предотвращает молчаливую неспособность передать внутренний распределитель содержащемуся элементу. - конец примечания]
Статья Class template scoped_allocator_adaptor раздела The Boost C++ Libraries BoostBook Documentation Subset Boost.Container Header Reference может быть полезна для разработчиков на c++ и boost.
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.