Есть ли способ инициализировать "сырую" статическую память под объекты не вызывая их конструкторы?
Пример кода:
template<typename T, size_t capacity>
class Container
{
private:
alignas(alignof(T)) uint8_t buffer[sizeof(T) * capacity];
size_t size = 0;
public:
~Container()
{
for (size_t i = 0; i < size; ++i)
{
(reinterpret_cast<T *>(&buffer[sizeof(T) * i]))->~T();
}
}
void add(const T & element)
{
new (&buffer[sizeof(T) * size]) T(element);
++size;
}
const T & get(size_t i)
{
return *(reinterpret_cast<T *>(&buffer[sizeof(T) * i]));
}
};
Вот такой обходной путь пришёл в голову. Но, если честно, смущают reinterpret cast'ы :), хотелось бы без них, через обычный T buffer[capacity], но без вызова конструкторов.