在写一个偏移数组类时(你的idxs从100开始变为1000,所以你创建的类考虑到了这一点而不浪费阵列中的前100个插槽)我遇到了问题。
如何初始化一个具有C数组元素的类(问题是T没有def构造函数)。基本上我希望阵列完全不受限制。例如:
class MyClass
{
MyClass(int i)
{
}
};
template <typename T, size_t n, size_t offset>
struct offsetedIdxArray
{
T data[n];// error line : error C2512: 'MyClass' : no appropriate default constructor available
offsetedIdxArray()
{
}
T& operator [](size_t pos)
{
return data[(pos-offset)];
}
};
用法:
offsetedIdxArray<MyClass, 1024,offset> oia;
使用def构造函数不是选项,因为我使用的类实际上是库类。
* 编辑:* 与此处描述的问题无关,但事实证明我的宝贵库类没有复制ctor,只需移动ctor,所以我不得不使用unique_ptr的向量。
答案 0 :(得分:8)
要获得一个静态大小的未初始化的存储部分,您可以使用对齐存储的“无类型”缓冲区,如C ++ 11中的std::aligned_storage<sizeof(T[n]), alignof(T)>::type
(在C ++ 03中,您需要使用{{ 1}}并对对齐进行手动更正,或使用char[sizeof(T[n])+something]
和编译器扩展指定对齐方式。)
这意味着使用placement new作为构造函数,并使用显式析构函数来进行销毁。由您来跟踪存储的哪些部分具有对象(因此需要销毁)以及哪些部分没有对象(并且不能调用析构函数)。当客户端请求一个根本没有初始化的元素时(由于它应该在的地方没有对象),也可以由你来满足。
另一种方法是使用char[sizeof(T[n])]
的数组,然后你不必关心破坏,只需将新元素分配给它们各自的索引。