我有一个本质上不可复制的类(一个线程,因此没有有意义的复制语义),并且我想拥有一个很大的“数组”,并用非默认构造函数相同地构造。请注意,数组是固定大小的。
我只能将默认构造函数与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/