Есть ли способ инициализировать "сырую" статическую память под объекты не вызывая их конструкторы?
Пример кода:
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], но без вызова конструкторов.