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

Is there a way to let "make_unique< T[ ] >" can forward arguments to constructor of T?

本文关键字:参数 转发 构造函数 gt unique make lt 有没有      更新时间:2023-10-16

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

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

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

但看起来没有make_unique版本可以像上面一样这样做。根据文档:如果make_unique正在制作数组,则只需要一个数组大小的参数。

我不能在这个场景中使用矢量,因为 ClassA 是一个由多个线程(生产者/消费者)共享的消息队列,而 Vector 会在空间不足的情况下将元素移动到新位置。

有没有另一种方法,在其中我可以制作一个只有显式构造函数的类的数组?同时,我仍然想使用unique_ptr来管理它们。

谢谢!

你不必使用 make_unique ,你可以构造指针并传递一些手动分配的内存。

class ClassA {
 public:
  int a;
  float b;
};
const auto x = std::unique_ptr<ClassA[]>{new ClassA[2]{{1, 2}, {1, 2}}};

我认为@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, ...);

尽管矢量的元素可能会被移动,但我的队列没有发生移动。移动的对象只是unique_ptr自己,但队列的地址永远不会改变。

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