![]() |
![]() ![]() ![]() ![]() ![]() |
![]() |
Boost Pointer Container LibraryBoost , ,
|
Тип | Объектconstили nonconst | Указатель | Описывает |
Т | a | ptr | А. Клонируемый тип |
Действительные выражения
Выражение | Тип | Семантика | Состояние |
новый_клон(а); | Т* | Выделите новый объект, который можно считать эквивалентнымобъекту. | typeid(*new_clone(a))==typeid(a) |
delete_clone(ptr); | пустота | Выделить объект, ранее выделенный, распределить_клон().. Не следует бросать |
В заголовке
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 в заголовках, не забудьте переслать объявление функций.
Предупреждение: Мы рассматриваем удаление реализации по умолчанию выше. Поэтому всегда следите за тем, чтобы вы перегружали функции для своих типов и никоим образом не полагались на дефолты.
Концепция Clone Allocator введена для формализации способа управления памятью хранимых объектов (а не указателями на хранимые объекты). Распределитель клонов позволяет пользователям применять пользовательские распределители / распределители для клонированных объектов.
Более подробную информацию можно найти ниже:
Запись
Тип | Объектconstили nonconst | Описывает |
Т | a | Тип |
Т* | ptr | Указатель наТ |
Действительные выражения
Выражение | Тип | Семантика | Состояние |
CloneAllocator::allocate_clone(a); | Т* | Выделите новый объект, который можно считать эквивалентнымобъекту. | typeid(*CloneAllocator::allocate_clone(a))==typeid(a) |
CloneAllocator::deallocate_clone(ptr); | пустота | Выделить объект, ранее выделенныйCloneAllocator::allocate_clone()или совместимый распределитель. Нельзя бросать. |
Библиотека поставляется с двумя заранее определенными распределителями клонов.
Это распределитель клонов по умолчанию, используемый всеми контейнерами указателей. Для большинства целей вам никогда не придется менять этот параметр.
Определение
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().
Этот класс обеспечивает способ удаления свойств владения указательными контейнерами. Как следует из названия, это означает, что вместо этого вы можете использовать указательные контейнеры в качестве представления в существующий контейнер.
Определение
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 } }; }
Библиотека состоит из следующих типов классов:
Адаптеры контейнера указателя используются, когда вы хотите сделать контейнер указателя, начиная с вашего собственного контейнера. Например, у вас может быть класс карты, который каким-то образом расширяетstd::map; класс адаптера затем позволяет использовать класс карты в качестве основы для нового контейнера указателей.
Библиотека предоставляет адаптер для каждого типа стандартного контейнера, выделенного в виде ссылок ниже:
Контейнеры указателей этой библиотеки построены с использованием адаптеров. Существует контейнер указателей для каждого типа стандартного контейнера, выделенного в качестве ссылок ниже.
На версии 1.34.0 Boost библиотека поддерживает сериализацию черезBoost.Serialization.
Конечно, для работы с сериализацией требуется, чтобы сам хранимый тип был сериализуем. Для карт, как ключевой тип, так и картографический тип должны быть сериализуемыми.
При работе с сериализацией (и сериализацией полимофических объектов в частности) обращайте особое внимание на эти части Boost. Сериализация:
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);
Составьте временную ловушку при сохранении неконстантного значениядля деталей.
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 ); ... } };
Подробнее см.Производные классы.
You need to use BOOST_CLASS_EXPORT to register the derived classes in your class hierarchy:
BOOST_CLASS_EXPORT( Derived )
См.Экспортный ключиОтслеживание объектовдля деталей.
Запомните эти три проблемы, и это может избавить вас от некоторых проблем.
Цель класса состоит в том, чтобы просто сказать контейнерам, что нулевые значения должны быть разрешены. Его определение тривиально:
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!
Есть три исключения, которые бросает эта библиотека. Исключительная иерархия выглядит следующим образом:
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 ); }; }
По версии 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.
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.
:: Главная :: ::
реклама |