如何将Derived对象添加到unique_ptr的向量中

use*_*497 3 c++ pointers vector unique-ptr

如何将不同的派生对象添加到unique_ptr的向量上.使用指针向量我将创建项目然后一个基指针指向对象并传递要添加的指针,但make_unique dos不接受指针,我不想为每种类型的派生objs制作重载函数.

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));
}
Run Code Online (Sandbox Code Playgroud)

/ ----------------------------------

跟进问题,你能在另一个内部找到unique_ptr的向量吗?我试过这个,(你们两个人都给我看过,模板Add_Item函数和项目Add_Item函数).但都产生了错误.

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

Item bag;
Item n_bag;
bag.Add_Item<I>(n_bag);
Run Code Online (Sandbox Code Playgroud)

跟进跟进,没有你不能,任何建议使用什么样的智能指针

T.C*_*.C. 6

unique_ptr<T>只要指向第二种类型的指针可以隐式转换为指向第一种类型的指针而不是数组类型,它就有一个从unique_ptr<U>不同类型移动的构造函数.所以只需使用.见演示.UUvec.push_back(make_unique<Item>(thing));

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

template <typename D>
void AddItem(const D& thing) {
    vec.push_back(make_unique<D>(thing));
}
Run Code Online (Sandbox Code Playgroud)

如果D不是派生自Base,则会出现编译错误push_back.

  • 如果包括澄清评论,即明确说明假设,@ TC答案会更好(顾问说). (2认同)