...one of the most highly
regarded and expertly designed C++ library projects in the
world.
— Herb Sutter and Andrei
Alexandrescu, C++
Coding Standards
boost::container::pmr::polymorphic_allocator
// In header: <boost/container/pmr/polymorphic_allocator.hpp> template<typename T> class polymorphic_allocator { public: // types typedef T value_type; // construct/copy/destruct polymorphic_allocator() noexcept; polymorphic_allocator(memory_resource *); polymorphic_allocator(const polymorphic_allocator &); template<typename U> polymorphic_allocator(const polymorphic_allocator< U > &) noexcept; polymorphic_allocator & operator=(const polymorphic_allocator &); // public member functions T * allocate(size_t); void deallocate(T *, size_t); template<typename U, class... Args> void construct(U *, Args &&...); template<typename U> void destroy(U *); polymorphic_allocator select_on_container_copy_construction() const; memory_resource * resource() const; };
A specialization of class template `polymorphic_allocator` conforms to the Allocator requirements. Constructed with different memory resources, different instances of the same specialization of `polymorphic_allocator` can exhibit entirely different allocation behavior. This runtime polymorphism allows objects that use polymorphic_allocator to behave as if they used different allocator types at run time even though they use the same static allocator type.
polymorphic_allocator
public
construct/copy/destructpolymorphic_allocator() noexcept;
Effects: Sets m_resource to `get_default_resource()`.
polymorphic_allocator(memory_resource * r);
Requires: r is non-null.
Effects: Sets m_resource to r.
Throws: Nothing
Notes: This constructor provides an implicit conversion from memory_resource*. Non-standard extension: if r is null m_resource is set to get_default_resource().
polymorphic_allocator(const polymorphic_allocator & other);
Effects: Sets m_resource to other.resource().
template<typename U> polymorphic_allocator(const polymorphic_allocator< U > & other) noexcept;
Effects: Sets m_resource to other.resource().
polymorphic_allocator & operator=(const polymorphic_allocator & other);
Effects: Sets m_resource to other.resource().
polymorphic_allocator
public member functionsT * allocate(size_t n);
Returns: Equivalent to `static_cast<T*>(m_resource->allocate(n * sizeof(T), alignof(T)))`.
void deallocate(T * p, size_t n);
Requires: p was allocated from a memory resource, x, equal to *m_resource, using `x.allocate(n * sizeof(T), alignof(T))`.
Effects: Equivalent to m_resource->deallocate(p, n * sizeof(T), alignof(T)).
Throws: Nothing.
template<typename U, class... Args> void construct(U * p, Args &&... args);
Requires: Uses-allocator construction of T with allocator `this->resource()` and constructor arguments `std::forward<Args>(args)...` is well-formed. [Note: uses-allocator construction is always well formed for types that do not use allocators. - end note]
Effects: Construct a T object at p by uses-allocator construction with allocator `this->resource()` and constructor arguments `std::forward<Args>(args)...`.
Throws: Nothing unless the constructor for T throws.
template<typename U> void destroy(U * p);
Effects: p->~U().
polymorphic_allocator select_on_container_copy_construction() const;
Returns: Equivalent to `polymorphic_allocator()`.
memory_resource * resource() const;
Returns: m_resource.