NoS*_*tAl 2 c++ arrays initialization
在编写一个偏移数组类时(你的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)];
}
};
Run Code Online (Sandbox Code Playgroud)
用法:
offsetedIdxArray<MyClass, 1024,offset> oia;
Run Code Online (Sandbox Code Playgroud)
使用def构造函数不是选项,因为我使用的类实际上是库类.
*编辑:* 与此处描述的问题无关,但事实证明我的宝贵的库类没有复制ctor,只需移动ctor,所以我不得不使用unique_ptr的向量.
要获得一个静态大小的未初始化存储部分,您可以使用对齐存储的"无类型"缓冲区,就像std::aligned_storage<sizeof(T[n]), alignof(T)>::type在C++ 11中一样(在C++ 03中,您需要使用char[sizeof(T[n])+something]并进行手动校正以进行对齐,或者使用char[sizeof(T[n])]和编译器扩展以指定对齐方式).
这意味着使用placement new作为构造函数,并使用显式析构函数来进行销毁.由您来跟踪存储的哪些部分具有对象(因此需要销毁)以及哪些部分没有对象(并且不能调用析构函数).当客户端请求一个根本没有初始化的元素时(由于它应该在的地方没有对象),也可以由你来满足.
另一种方法是使用boost::optionals 数组,然后您不必关心销毁,只需将新元素分配给它们各自的索引即可.
| 归档时间: |
|
| 查看次数: |
563 次 |
| 最近记录: |