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

Boost Pointer Container Library

Boost , ,

Boost C++ Libraries

...one of the most highly regarded and expertly designed C++ library projects in the world. Herb Sutter and Andrei Alexandrescu, C++ Coding Standards

Boost Pointer Container Library

Reference

Документация разделена на пояснения для каждого контейнера. Когда контейнеры имеют один и тот же интерфейс, этот общий интерфейс объясняется только один раз, но ссылки всегда предоставляются на более релевантную информацию. Пожалуйста, убедитесь, что вы понимаете концепциюClonableиКонцепция.

The Clonable concept

Уточнение

  • Распределяемая куча
  • Куча размещаемых

Концепция Clonable введена для формализации требований к копированию объектов, расположенных в куче. ТипTможет быть клонируемым, даже если он не является подходящим или копируемым. Обратите внимание, что многие операции на контейнерах даже не требуют хранения.

Запись

Тип Объектconstили nonconst Указатель Описывает
Т a ptr А. Клонируемый тип

Действительные выражения

Выражение Тип Семантика Состояние
новый_клон(а); Т* Выделите новый объект, который можно считать эквивалентнымобъекту. typeid(*new_clone(a))==typeid(a)
delete_clone(ptr); пустота Выделить объект, ранее выделенный, распределить_клон().. Не следует бросать  

Default implementation

В заголовкеприведена реализация по умолчанию двух функций:

namespace boost
{
    template< class T >
    inline T* new_clone( const T& t )
    {
        return new T( t );
    }
    template< class T >
    void delete_clone( const T* t )
    {
        checked_delete( t );
    }
}

Обратите внимание, что эта реализация делает нормой Копии Конструктивные классы автоматически Клонируемые, еслиоператорновый()илиоператорне удалить()скрыты.

Эти две функции представляют собой слой опосредованности, который необходим для поддержки классов, которые по умолчанию не конструируются. Обратите внимание, что реализация опирается на аргументно-зависимый поиск (ADL), чтобы найти правильную версиюnew_clone()иdelete_clone(). Это означает, что не нужно перегружать или специализировать функцию в пространстве имен бустера, но ее можно разместить вместе с остальным интерфейсом класса. Если вы реализуете класс inline в заголовках, не забудьте переслать объявление функций.

Предупреждение: Мы рассматриваем удаление реализации по умолчанию выше. Поэтому всегда следите за тем, чтобы вы перегружали функции для своих типов и никоим образом не полагались на дефолты.

The Clone Allocator concept

Концепция Clone Allocator введена для формализации способа управления памятью хранимых объектов (а не указателями на хранимые объекты). Распределитель клонов позволяет пользователям применять пользовательские распределители / распределители для клонированных объектов.

Более подробную информацию можно найти ниже:

Clone Allocator requirements

Запись

Тип Объектconstили nonconst Описывает
Т a Тип
Т* ptr Указатель наТ

Действительные выражения

Выражение Тип Семантика Состояние
CloneAllocator::allocate_clone(a); Т* Выделите новый объект, который можно считать эквивалентнымобъекту. typeid(*CloneAllocator::allocate_clone(a))==typeid(a)
CloneAllocator::deallocate_clone(ptr); пустота Выделить объект, ранее выделенныйCloneAllocator::allocate_clone()или совместимый распределитель. Нельзя бросать.  

Библиотека поставляется с двумя заранее определенными распределителями клонов.

Class heap_clone_allocator

Это распределитель клонов по умолчанию, используемый всеми контейнерами указателей. Для большинства целей вам никогда не придется менять этот параметр.

Определение

namespace boost
{        
    struct heap_clone_allocator
    {
        template< class U >
        static U* allocate_clone( const U& r )
        {
            return new_clone( r );
        }
        template< class U >
        static void deallocate_clone( const U* r )
        {
            delete_clone( r );
        }
    };
}

Обратите внимание, что приведенное выше определение позволяет поддерживать пользовательские схемы распределения, полагаясь наnew_clone()иdelete_clone().

Class view_clone_allocator

Этот класс обеспечивает способ удаления свойств владения указательными контейнерами. Как следует из названия, это означает, что вместо этого вы можете использовать указательные контейнеры в качестве представления в существующий контейнер.

Определение

namespace boost
{
    struct view_clone_allocator
    {
        template< class U >
        static U* allocate_clone( const U& r )
        {
            return const_cast<U*>(&r);
        }
        template< class U >
        static void deallocate_clone( const U* )
        {
            // empty
        }
    };
}

Class hierarchy

Библиотека состоит из следующих типов классов:

  1. Адаптер контейнеров Pointer
  1. Контейнеры Pointer

Адаптеры контейнера указателя используются, когда вы хотите сделать контейнер указателя, начиная с вашего собственного контейнера. Например, у вас может быть класс карты, который каким-то образом расширяетstd::map; класс адаптера затем позволяет использовать класс карты в качестве основы для нового контейнера указателей.

Библиотека предоставляет адаптер для каждого типа стандартного контейнера, выделенного в виде ссылок ниже:

Контейнеры указателей этой библиотеки построены с использованием адаптеров. Существует контейнер указателей для каждого типа стандартного контейнера, выделенного в качестве ссылок ниже.

Serialization

На версии 1.34.0 Boost библиотека поддерживает сериализацию черезBoost.Serialization.

Конечно, для работы с сериализацией требуется, чтобы сам хранимый тип был сериализуем. Для карт, как ключевой тип, так и картографический тип должны быть сериализуемыми.

При работе с сериализацией (и сериализацией полимофических объектов в частности) обращайте особое внимание на эти части Boost. Сериализация:

  1. Output/saving requires a const-reference:

    //
    // serialization helper: we can't save a non-const object
    // 
    template< class T >
    inline T const& as_const( T const& r )
    {
        return r;
    }
    ...
    Container cont;
    std::ofstream ofs("filename");
    boost::archive::text_oarchive oa(ofs);
    oa << as_const(cont);
    

    Составьте временную ловушку при сохранении неконстантного значениядля деталей.

  1. Derived classes need to call base_object() function:

    struct Derived : Base
    {
        template< class Archive >
        void serialize( Archive& ar, const unsigned int version )
        {
            ar & boost::serialization::base_object<Base>( *this );
            ...
        }   
    };
    

    Подробнее см.Производные классы.

  1. You need to use BOOST_CLASS_EXPORT to register the derived classes in your class hierarchy:

    BOOST_CLASS_EXPORT( Derived )
    

    См.Экспортный ключиОтслеживание объектовдля деталей.

Запомните эти три проблемы, и это может избавить вас от некоторых проблем.

Class nullable

Цель класса состоит в том, чтобы просто сказать контейнерам, что нулевые значения должны быть разрешены. Его определение тривиально:

namespace boost
{
    template< class T >
    struct nullable
    {
        typedef T type;
    };  
}

Обратите внимание, чтоnullableне влияет на интерфейс контейнеров (кромеis_null()функций). Например, не имеет смысла делать

boost::ptr_vector< boost::nullable<T> > vec;
vec.push_back( 0 );                      // ok
vec.push_back( new boost::nullable<T> ); // no no!
boost::nullable<T>& ref = vec[0];        // also no no!

Exception classes

Есть три исключения, которые бросает эта библиотека. Исключительная иерархия выглядит следующим образом:

namespace boost
{
    class bad_ptr_container_operation : public std::exception
    {
    public:
        bad_ptr_container_operation( const char* what );
    };
    
    class bad_index : public bad_ptr_container_operation
    {
    public:
        bad_index( const char* what );
    };
    class bad_pointer : public bad_ptr_container_operation
    {
    public:
        bad_pointer();
        bad_pointer( const char* what );
    };
}

Disabling the use of exceptions

По версии 1.34.0 Boost библиотека позволяет полностью отключить исключения. Это означает, что библиотека больше подходит для доменов, где не используются исключения. Кроме того, он немного ускоряет операции. Вместо исключения библиотека просто вызываетBOOST_ASSERT.

Чтобы отключить исключения, просто определите этот макрос перед включением любого заголовка:

#define BOOST_PTR_CONTAINER_NO_EXCEPTIONS 1
#include <boost/ptr_container/ptr_vector.hpp>

Однако рекомендуется определить макрос в командной строке, поэтому вы абсолютно уверены, что все заголовки составлены одинаково. В противном случае вы можете нарушить правило одного определения.

ЕслиBOOST_NO_EXCEPTIONSопределено, затемBOOST_PTR_CONTAINER_NO_EXCEPTIONSтакже определено.


Навигация:


Copyright:Thorsten Ottosen 2004-2007. Use, modification and distribution is subject to the Boost Software License, Version 1.0 (see LICENSE_1_0.txt).

Статья Boost Pointer Container Library раздела может быть полезна для разработчиков на c++ и boost.




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



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


реклама


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

Время компиляции файла: 2024-08-30 11:47:00
2025-07-05 11:42:10/0.0090241432189941/0