C++ 如何将派生对象添加到唯一_ptr的向量

C++ 如何将派生对象添加到唯一_ptr的向量,c++,pointers,vector,unique-ptr,C++,Pointers,Vector,Unique Ptr,如何将不同的派生对象添加到唯一的向量上。 使用指针向量,我将创建项,然后创建一个指向对象的基指针,并传递要添加的指针,但要使_唯一,不要使用指针,我不想为每种类型的派生对象创建重载函数 class Base{...}; class Item:public Base{...}; Add_Item(Base* thing) { vec.push_back(thing); } //Problem with this is i have multiple derived objs a

如何将不同的派生对象添加到唯一的向量上。 使用指针向量,我将创建项,然后创建一个指向对象的基指针,并传递要添加的指针,但要使_唯一,不要使用指针,我不想为每种类型的派生对象创建重载函数

class Base{...};

class Item:public Base{...};

Add_Item(Base* thing)
{   
    vec.push_back(thing);
}

//Problem with this is i have multiple derived objs and would rather have 1 Add_Item instead of multiple Add_Item functions.(if possible)
Add_Item(Item thing)
{   //this runs,but i lose anything that was in Item class
    vec.push_back(make_unique<Base>(thing));
}
类基类{…};
类项:公共基{…};
添加_项(基本*项)
{   
向后推(东西);
}
//问题是我有多个派生的obj,我宁愿有一个Add_项而不是多个Add_项函数。(如果可能的话)
添加项目(项目内容)
{//这会运行,但我丢失了Item类中的所有内容
把你推回(使你独一无二);
}
/----------------------------------

接下来的问题是,你能在另一个向量中有一个唯一的向量吗。 我已经试过了,(你们向我展示的两种方式,模板添加项函数和项目添加项函数)。但两者都产生了错误

class Item: public Item
{  vector<unique_ptr<Base>>inv }

Item bag;
Item n_bag;
bag.Add_Item<I>(n_bag);
类项目:公共项目
{vectorinv}
物品袋;
物品n_袋;
袋子。添加物品(n袋子);
follow up up,no you cant,任何关于使用哪种智能指针的建议使用
std::make_unique()
helper函数可以创建给定类型的新对象。在您的例子中,这是一个
Base
对象,它不是您想要的

相反,您可以手动构造所需的
std::unique\u ptr

vec.push_back(std::unique_ptr<Base>(new Item(thing)));
unique_ptr
有一个构造函数,它从不同类型的
unique_ptr
移动,只要指向第二种类型的指针隐式转换为指向第一种类型的指针,并且
U
不是数组类型。所以只要使用
vec.push_back(使_唯一(东西))。看

要接受从
Base
派生的所有内容,请使用模板:

template <typename D>
void AddItem(const D& thing) {
    vec.push_back(make_unique<D>(thing));
}
模板
无效附加项(常量D和对象){
把你推回(使你独一无二);
}

如果
D
不是从
Base
派生的,则在
push_back

处会出现编译错误。如果希望将
AddItem()
方法作为模板方法,则不必为每个派生类编写不同的函数。修改现有实现:

template <typename DERIVED>
void
AddItem (const DERIVED &thing)
{
    vec.push_back(make_unique<DERIVED>(thing));
}
模板
无效的
AddItem(常量派生和对象)
{
把你推回(使你独一无二);
}

+1但当然,我们需要
std::make_unique
,这不是C++11的一部分。@Cheersandhth.-Alf哦,OP在他们的代码中使用了这一点,所以我很高兴假设它是可用的。@TC的答案会更好(正如顾问所说),如果包括澄清的评论,即明确说明的假设。谢谢大家的帮助,我有一个后续问题,是否有可能在另一个唯一向量中有一个唯一向量?
template <typename DERIVED>
void
AddItem (const DERIVED &thing)
{
    vec.push_back(make_unique<DERIVED>(thing));
}