Цель повторной привязки в следующем контейнере

#c #c 17 #allocator

Вопрос:

Я читаю некоторый код на C и специально пытаюсь понять настраиваемый контейнер.

Контейнер имеет следующие параметры шаблона:

  template<typename T, typename Alloc>
 class container{ ... };
 

Где T находится тип данных, таких как float или int . Он Alloc является распределителем и может быть одной из стандартных библиотек.

В этом контейнере я нахожу следующее:

  class Container{ ....
 template<typename NewType> 
  struct Rebind
   { 
      using newalloc = typename std::allocator_traits<Alloc>::template rebind_alloc<NewType>; 
      using Other    =       container<NewType, newalloc>
   }
 }
 

Я нигде не нахожу член структуры Rebind , используемый явно, по крайней мере, и я изо всех сил пытаюсь понять его назначение.

Чего разработчик пытается достичь, имея структуру внутри контейнера?

Ответ №1:

Это не элемент данных. Это элемент шаблона, который позволяет коду (который, вероятно, сам является шаблоном) получать другой тип контейнера с аналогичным распределителем.

например, применение функции к каждому элементу для получения нового контейнера результатов

 template <typename Container, typename Function, typename Result = typename Container::template Rebind<std::invoke_result_t<Function, typename Container::const_reference>>::Other>
Result transform(const Container amp; container, Function function)
{
    Result result(container.get_allocator());
    for (auto amp; element : container) { result.push_back(function(element); }
    return resu<
}