C++ - 使用初始化列表构造unique_ptr的向量

4
我有一个名为“group”的类,它将在其中保持一些基类,这些基类以std::unique_ptr的形式存储(即多态)。顺序并不重要,也不要紧是否其中某些元素相等。这是用std::vector完成的任务,我希望在成员声明中将其标识为const
作为设计的一部分,我想通过initializer_list传递所有适合放入group对象的元素,如下所示:
class base;

class derived1 : base;
class derived2 : base;
class derived3 : base;

group my_object({ new derived1() , new derived2() , new derived3() });

但我在以下方面遇到了问题:
  • group 类中的向量将由 std::unique_ptr 组成,而不是对象。
  • 由于 std::initializer_list 只能包含一种类型的对象,因此该类型应为指向基类的指针。

考虑到所有这些,我应该如何实现它? 由于 group 类的向量中保存的元素不应更改,因此在构造函数的初始化列表中初始化它要更有效率。 但是,std::unique_ptr 不可复制,我无法想出如何从由原始指针组成的 initializer_list 构建一个 vector,其中包含 unique_ptr<base_class>


@jrok 抱歉,那是个打错字。 - djsp
“在构造函数的初始化列表中初始化它要比在向量上调用reserve(),然后为每个指针调用push_back/emplace_back更有效。” -- 你确定吗?这真的比在向量上调用reserve(),然后为每个指针调用push_back/emplace_back更有效吗?源代码可能更美观,但我怀疑你不会注意到效率上的区别。 - Benjamin Lindley
可能是Can I list-initialize a vector of move-only type?的重复问题。 - juanchopanza
1个回答

3
你可以像这样制作初始化列表:
#include<memory>

class base{};

class derived1 : public base{};
class derived2 : public base{};;
class derived3 : public base{};;

using namespace std;
int main (){
  auto ptrs={ unique_ptr<base>(new derived1()) , unique_ptr<base>(new derived2()) , unique_ptr<base>(new derived3()) };

}

但问题似乎在于您无法从初始化器列表中移动,因为初始化器列表是常量。这里有更多信息。 初始化器列表和移动语义

我在就具有构造函数参数的类的原地向量构造从初始化列表中进行提问,与此相关但不同。


但是我该如何在我的“group”类的构造函数中处理它呢?我怎样告诉一个“vector”的构造函数去获取“initializer_list”中的对象并将它们移动 - djsp
1
initializer_lists是常量。它们只是不能被移动。 - Johan Lundberg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接