我试着写一个"内联向量"用于在堆栈上方便地存储多个元素的类:
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
的{{1}}未在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
那么,即使数组元素类型需要构造函数,如何使一个未初始化的数组成员成为可能呢?
答案 0 :(得分:6)
通过使数组成为char
s和稍后放置new
的数组。 char
是唯一允许您执行此操作的类型。
当你在它的时候,你也可以编写自己的 allocator (将数组作为其成员之一),并将其插入std::vector
而不是重新发明整个社会。
std::vector<int, YourAllocatorType<int, 256>> v;
答案 1 :(得分:1)
那么,即使数组元素类型需要构造函数,如何使一个未初始化的数组成员成为可能呢?
不适用于T x[n]
...但您可以将任何旧T*
指向正确对齐的未初始化内存,然后管理您自己的临时构造和销毁。您还可以探索使用您的类型创建union
并说出char
,并拥有一系列工会....