Я попытался написать «инлайн-вектор» класс для хранения количества элементов в стеке удобно:C++ элемент массива без инициализации
template<typename T, size_t size_ = 256>
struct InlineVector{
T content[size_];
size_t num;
T() : num(0) {}
~T() { for(size_t s = 0; s < num; s++){ content[s]->~T(); } }
template<typename _Up, typename... _Args>
void emplace_back(_Args&&... __args) { new (&content[num++]) T(__args); }
T& get(size_t i) { assert(i < num); return content[i]; }
}
соображений эффективности, я хочу, чтобы content
не инициализируется в X
, даже если T
имеет только нетривиальный конструктор. Как вы видите, содержимое инсайтируется позже с размещением нового, когда оно фактически вставлено. Однако C++, похоже, требует, чтобы все элементы content
были инициализированы при инициализации X
. Например, это не компилируется:
struct Y{ Y(int){} }
X<Y> foo; // compile error, no constructor for Y is called in the construction of X
Итак, как можно иметь элемент массива, который не инициализирован, даже если тип элемента массива нужен конструктор?
Интересная идея с распределителем. И спасибо за фактический ответ на использование массива 'char', поскольку распределитель будет иметь ту же проблему, что и вектор. Кажется, что нет никакого пути вокруг массива 'char', независимо от того, написана ли распределитель или вектор. – gexicide
@gexicide: Да не очень :) –