Какова цель allocator_traits <T>в C ++ 0x? - PullRequest
12 голосов
/ 21 декабря 2010

Почему стандартный интерфейс C ++ 03 для запроса типов элементов для распределителей не используется в C ++ 0x?В каких случаях нельзя использовать типы элементов?

Ответы [ 2 ]

7 голосов
/ 21 декабря 2010

Я не знаком с подобными вещами ( вообще ), но этот документ кажется хорошей отправной точкой, чтобы понять основы 100 * :

Краеугольным камнем этого предложения является определение allocator_traits шаблон, содержащий типы и статические функции-члены для использования распределителей, эффективно заменяет концепцию Allocator, которая была потеряна в Frankfurt .

6 голосов
/ 22 мая 2013

Чтобы объяснить allocator_traits в терминах шаблона проектирования, его Адаптер позволяет обернуть ваш собственный Allocator, который удовлетворяет гораздо меньшим требованиям реализации (не нужно создавать, уничтожать, все эти typedefs ...) и поворачивать егов FlyWeight объект, который выполняет остальные требования реализации Allocator для вас со статическими членами и типами.

С помощью allocator_traits вам просто нужно предоставить не менее 10 строк кода для вашего пользовательского распределителя, согласно странице 3 документа open-std Scoped Allocator Model (спасибо за @icecrime за упоминание).

Я думаю, что allocator_traits и allocator - это хороший реальный пример превращения не-FlyWeight объект в FlyWeight, чтобы облегчить бремя деталей реализации.Это хорошая практика проектирования API для превращения класса в FlyWeight, который должен был быть в первую очередь FlyWeight.

Для программистов Java, с точки зрения шаблона проектирования, std :: allocator_traits подобен пакетным закрытым классам CharacterDataLatin1,ChracterData00, CharacterData0E, 01, 02 ... который наследуется от java.lang.CharacterData для предоставления статического определения Unicode и помощников, которые должны использоваться всеми экземплярами классов Character (std :: allocator).

Редактировать : еще одно преимущество косвенного вызова вашего пользовательского распределителя с помощью allocator_traits заключается в том, что он гарантирует совместимость с foward (стр. 3 из Модель распределителя Scoped ).Количество требований может возрасти в будущем, и даже если вы не знаете о внедрении новых требований к вашему распределителю, эти требования уже будут присутствовать в allocator_traits, реализованном производителем компилятора.Зная, что контейнеры C ++ вызывают allocator косвенно с помощью allocator_traits, контейнеры STL, использующие ваш пользовательский распределитель, получат выгоду от новых требований без необходимости изменения вашего кода.

...