2

在编写偏移数组类时(您的 idx 从假设 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 的向量。

4

1 回答 1

9

要获得静态大小的未初始化存储部分,您可以使用对齐存储的“无类型”缓冲区,例如std::aligned_storage<sizeof(T[n]), alignof(T)>::type在 C++11 中(在 C++03 中,您需要使用 achar[sizeof(T[n])+something]并手动更正对齐,或使用char[sizeof(T[n])]和编译器扩展来指定对齐方式)。

这意味着对构造函数使用placement new,而显式析构函数调用销毁。您可以跟踪该存储的哪些部分有对象(因此需要销毁)以及哪些部分没有对象(并且不能调用析构函数)。当客户端请求一个根本没有初始化的元素(在它应该在的地方没有对象)时,你也可以满足你的需求。

另一种方法是使用 s 数组boost::optional,然后您不必关心破坏,只需将新元素分配给它们各自的索引即可。

于 2012-09-06T16:51:29.027 回答