std::allocator_traits
творит чудеса автоматически, когда я предоставляю контейнер в стиле STL с распределителем, имеющим один параметр шаблона, но не работает, когда я предоставляю контейнер в стиле STL с распределителем, имеющим два параметра шаблона, но в остальном похожим.
Что мне нужно сделать, чтобы сообщить std::allocator_traits
, как взаимодействовать с распределителем, который имеет более одного параметра шаблона? Можно ли в этом случае заставить std::allocator_traits
предоставить разумные значения по умолчанию?
В качестве примера, если я возьму простой распределитель, который Говард Хиннант предоставил в Allocator Boilerplate, и передам его std::vector<>
значит все хорошо. Если я добавлю фиктивный параметр int
в шаблон allocator
(и при необходимости внесу небольшие изменения), то я получу ошибки компилятора, потому что компилятор, среди прочего, не смог найти rebind
.
Вот это описание в коде:
http://coliru.stacked-crooked.com/a/173c57264137a351
Если в этом случае мне придется специализироваться std::allocator_traits
, есть ли способ получить значения по умолчанию?
std::allocator_traits
заполнил за меня большую часть деталей. Есть ли какое-либо преимущество в специализацииstd::allocator_traits
по сравнению с завершением концепции распределителя без него? - person Praxeolitic   schedule 18.01.2016rebind
в распределителе, смотрите мой ответ. - person TemplateRex   schedule 18.01.2016rebind
. Это может быть единственное, что вам нужно не делать по умолчанию, что было бы намного проще, чем специализацияallocator_traits
. - person Howard Hinnant   schedule 19.01.2016Alloc<T, Args...>
. - person TemplateRex   schedule 19.01.2016vector
libc++ не вызываетrebind
. Пример OP, скорее всего, завершится ошибкой с другим контейнером, который должен вызыватьrebind
. - person Howard Hinnant   schedule 19.01.2016std::list
вместоstd::vector
libc++ также не компилируется. См. также эти вопросы и ответы, где @JonathanWakely объясняет практику libstdc++ всегда проходить черезrebind
. - person TemplateRex   schedule 19.01.2016vector<int, std::allocator<char>>
оказывает клиенту услугу. libc++ изо всех сил старается уведомить клиента как можно скорее, если между распределителем и контейнером есть несоответствие, подобное этому: github.com/llvm-mirror/libcxx/blob/master/include/ Мотивация такого поведения заключается в том, что логика программы может зависеть от двух независимо объявленных контейнеров, имеющих того же типа. И если их тип отличается только случайно неправильно объявленными распределителями, лучше всего знать это во время компиляции, как можно скорее. - person Howard Hinnant   schedule 19.01.2016