Реализуйте select_on_container_copy_construction () для STL Allocator - PullRequest
0 голосов
/ 04 декабря 2018

Я хотел бы предоставить пользовательский

select_on_container_copy_construction()

http://www.cplusplus.com/reference/memory/allocator_traits/select_on_container_copy_construction/

для моего распределителя.

Я попытался добавить его прямо в мой класс распределителя, как это:

T select_on_container_copy_construction( const T& a ) const {
  ...
}

но он не вызывается.

Я пытался реализовать его как черту типа:

namespace std {
  template<class T>
  struct allocator_traits<static_allocator<T>> {
    typedef T value_type;
  };
}

, но теперь мне нужно реализовать все остальные чертытакже функции.

Есть ли более простой способ просто перезаписать эту функцию, не предоставляя полный allocator_traits?

Полный пример кода можно найти здесь: https://onlinegdb.com/H1iJJIN1N

Я пробовал разные варианты добавления static / const к функции.

1 Ответ

0 голосов
/ 04 декабря 2018

Allocator именованное требование [allocator.requirements] предполагает следующий синтаксис вызова:

a.select_on_container_copy_construction()

и ожидает, что возвращаемый тип будет типом распределителя.

Вы объявляете дополнительный параметр (const T& a), который делает вышеуказанный вызов некорректным, заставляя std::allocator_traits вернуться к реализации dafault (возвращая экземпляр распределителя) [allocator.traits]:

static Alloc select_on_container_copy_construction(const Alloc& rhs);

Возвращает: rhs.select_on_container_copy_construction(), если это выражение правильно сформировано;в противном случае rhs.

...