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