我有一个本质上不可复制的类(一个线程,因此没有有意义的复制语义),并且我想拥有一个很大的“数组”,并用非默认构造函数相同地构造。请注意,数组是固定大小的。

我只能将默认构造函数与C++数组一起使用,除非我单独初始化每个构造函数。

Thread myArray[128];   // uses default constructor - wrong

我可以明确列出对象的构造函数和参数,但这很冗长和丑陋
Thread myArray[128] = { Thread(params,...), Thread(params,...), ... x 128 ;  // ugly

看来我不能使用STL vector ,因为对象是不可复制的-事件,尽管 vector 从不改变大小。我猜构造函数实际上确实在复制!
std::vector<Thread> myVector(128, Thread(params,...));// won't compile

我这样做的方法是使用一组智能指针和一个初始化循环,但也许我缺少了一些东西:

还有其他方法-可能是使用 boost 容器,还是使用其他容器类型?

最佳答案

智能指针的 vector ,每个实例动态
分配,绝对是最简单的方法。否则(我会
仅在绝对必要时才这样做),您可以或多或少地
模拟std::vector在内部执行的操作。沿着东西
的行:

union
{
    double just_to_ensure_alignment;
    unsigned char data[ sizeof(Thread) * elementCount ];
} array;

//  construct...
for ( int i = 0; i != elementCount; ++ i )
    new (data + i * sizeof(Thread)) Thread(params,...);

//  access...
Thread& getAt( int i )
{
    return reinterpret_cast<Thread*>( data + i * sizeof(Thread) );
}

(我实际上将其包装在一个类中,如果只是为了能够使用operator[]而不是getAt。)

关于c++ - 构造不可复制对象的 "array",我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6042490/

10-11 22:42
查看更多