阻止调用类中的数组的默认构造函数

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的向量.

R. *_*des 8

要获得一个静态大小的未初始化存储部分,您可以使用对齐存储的"无类型"缓冲区,就像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 数组,然后您不必关心销毁,只需将新元素分配给它们各自的索引即可.