有没有办法让“ make_unique <T []>”可以将参数转发给T的构造函数?

时间:2019-01-29 06:20:18

标签: c++ arrays initialization unique-ptr

我在一个由unique_ptr指向的数组中有一些相同类的对象, 每个对象只能使用显式构造函数创建,因为必须将一些参数传递给构造函数。

初始化时,我将创建如下的unique_ptr:

unique_ptr<ClassA [ ] >  arrayA = make_unique<ClassA [ ]>(100, some args to be passed );

但是看起来像上面那样没有版本的make_unique可以做到。 根据docs所述:如果make_unique正在创建一个数组,则只需一个参数即可,即数组的大小。

在这种情况下,我不能使用vector,因为ClassA是由多个线程(生产者/消费者)共享的消息队列, 如果空间不足,vector会将元素移到新位置。

还有另一种方法,可以在其中创建仅具有显式构造函数的类的数组吗? 同时,我仍然想使用unique_ptr来管理它们。

谢谢!

2 个答案:

答案 0 :(得分:0)

我认为@AchimGuetlein提出的想法更好。

定义如下:

vector<unique_ptr<ClassA> > container;

for (i = 0; i<number of queues; ++i)
    container.emplace_back(make_unique<ClassA>(args to constructor of ClassA));

而不是:

unique_ptr<ClassA [] > ques = make_unique<ClassA [] >(n, ...);

尽管vector的元素可能会移动,但我的队列没有发生任何移动。移动的objs只是unique_ptr自身,但是队列的地址永远不会改变。

很抱歉将其作为答案提交,因为无法在注释中将代码示例优雅地显示为codelet。

答案 1 :(得分:0)

您不必使用<?xmlversion="1.0" encoding="UTF-8"?> <PayloadList> <Payload> <IFXResp> <IFX> <GeneralStatus> <StatusCode>0</StatusCode> <StatusLevel>IFX</StatusLevel> <StatusDesc>The request was processed successfully.</StatusDesc> </GeneralStatus> <Status> <StatusCode>0</StatusCode> <Severity>Info</Severity> <StatusDesc>The request was processed successfully.</StatusDesc> <SupportUID>DD2B1DFF-57657657-6767-8013-C9787878AF00</SupportUID> </Status> <SignonRs> </IFX> </IFXResp> </Payload> </PayloadList> ,可以构造指针并传递一些手动分配的内存。

make_unique