Положение
Я пишу диспетчер памяти для динамического выделения памяти. Чтобы использовать class A
при вызове operator new
(или delete
), достаточно class A
наследовать от class CustomAllocate
, который сам перегружает new
и delete
таким образом, что использует диспетчер памяти.
Задача
Однако, по-видимому, я полностью пропустил требования к выравниванию. К сожалению, CustomAllocate::new
не имеет информации о том, как class A
, наследующий от него, должен быть выровнен, поскольку единственным параметром является размер запрошенной памяти. Я ищу способ включить информацию о выравнивании без необходимости перегрузки new
(и delete
) в каждый class A
для использования диспетчера памяти.
Идея 1 (и почему она не работает)
Шаблон class CustomAllocate
с целочисленным значением, представляющим требования к выравниванию и наследуемым так: class A : public CustomAllocate< alignof(A) >
.
Невозможно, потому что alignof(A)
не может быть известно во время его передачи в качестве параметра шаблона, даже если переданный параметр никогда не должен изменять требования выравнивания class A
.
Идея 2 (и почему она не работает)
Наличие чисто виртуальной функции virtual int CustomAllocate::getAlignment() = 0
, которая реализуется в каждом class A
путем вставки копии, например, return alignof(A);
.
Невозможно, потому что new
является статическим и, следовательно, никогда не сможет получить доступ к виртуальной функции.
Есть рабочие идеи?