Перепривязка в пользовательском распределителе STL с предварительно выделенным блоком

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

Так как яне хотите какую-либо инициализацию для элементов в предварительно выделенном блоке, что-то вроде этого не будет работать:

T buffer[N];

потому что в этом случаеTконструктор будет вызван дляN элементы блока.

Так как я понимаю, чтоstd::aligned_storage не звонитTконструктор, я подумал об использованииstd::aligned_storage, что-то вроде этого:

std::aligned_storage<
    N * sizeof(T),
    std::alignment_of<T>::value 
>::type buffer;

T* base = static_cast<T*>( static_cast<void*>(&buffer) );

И тогда распределитель может просто увеличивать базовый указатель, когда запрашивается выделение для T (до(base+N)) и T можно построитьна месте (с размещениемnew) при необходимости.

Я хотел бы использовать эту схему для определенияпользовательский распределитель для контейнеров STL, Тем не менее, мне кажется, что здесь может быть проблема дляперекомпоновка, На самом деле, если я правильно понимаю, распределитель STL должен поддерживать повторное связывание с типомT к типуUнапример, потому что контейнеры, какstd::list<T> (или другие основанные на узле контейнеры, такие какstd::map) использовать распределители для выделенияузлы которые на самом деле не типаT, но другого типаU (содержащийT и другая служебная информация «заголовка» для узла). Итак, будет ли вышеупомянутоеstd::aligned_storage подход хорошо работает для переплета? Или (как я думаю) правильное выравнивание дляTс делаетне подразумевает правильное выравнивание для другого другого типаU?

Как можно решить эту проблему?

Как я мог определить вышеупомянутоеbuffer чтобы заставить его работать также для привязки к другому типуU?

Стоит ли атаковать эту проблему с другой точки зрения? Если так, то?

Ответы на вопрос(1)

Ваш ответ на вопрос