Гибкий механизм спецификации опционов, используемый Boost.Intrusive для крючков и контейнеров, имеет несколько недостатков:
- Если пользователь задает одни и те же опции в разном порядке или задает некоторые опции и оставляет остальные в качестве по умолчанию, тип создаваемого контейнера / крюка будет другим. Иногда это раздражает, потому что два программиста, указывающие одни и те же варианты, могут оказаться несовместимыми типами. Например, следующие два списка, хотя и используют одни и те же варианты, не имеют одного типа:
#include <boost/intrusive/list.hpp>
using namespace boost::intrusive;
typedef list<T, constant_time_size<true>, size_type<std::size_t> List1;
typedef list<T> List2;
- Указание параметров приводит к длинным символам шаблонов для классов и функций. Спецификаторы опционов сами являются глаголами и без вариадических шаблонов, для неопределенных опций присваиваются несколько параметров шаблонов по умолчанию. Объект и отладка информационных файлов могут расти, и время компиляции может пострадать, если будут выпущены длинные имена.
Для решения этих вопросов Boost.Intrusive предлагает некоторые метафункции помощника, которые уменьшают длину символов и создают один и тот же тип, если используются одни и те же варианты (или явно или косвенно). Это также улучшает время компиляции. Все контейнеры и крючки имеют свои соответствующие версии make_xxx
. Ранее показанный пример можно переписать так, чтобы получить тот же тип списка:
#include <boost/intrusive/list.hpp>
using namespace boost::intrusive;
#include <boost/intrusive/list.hpp>
using namespace boost::intrusive;
typedef make_list<T, constant_time_size<true>, size_type<std::size_t>::type List1;
typedef make_list<T>::type List2;
Продюсированные длины символов и время компиляции, как правило, будет короче, а файлы объектов/отладок меньше. Если вы обеспокоены размерами файлов и временем компиляции, этот вариант является вашим лучшим выбором.