加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

在C中的unique_ptr之间进行转换

发布时间:2020-12-16 09:50:19 所属栏目:百科 来源:网络整理
导读:我有以下C 11构造: #include vector#include memoryclass X {public: void f(void) { }};class Y : public X {public: void g(void) { }};class A {private: std::vector std::unique_ptr X xs;public: void addX(std::unique_ptr X ref) { xs.push_back(st
我有以下C 11构造:

#include <vector>
#include <memory>

class X {
public:
        void f(void) { }
};

class Y : public X {
public:
        void g(void) { }
};

class A {
private:
        std::vector <std::unique_ptr <X> > xs;
public:
        void addX(std::unique_ptr <X> &ref) {
                xs.push_back(std::move(ref));
        }
};

int main() {
        A a;

        std::unique_ptr <Y> y(new Y());
        y->f();
        y->g();

        std::unique_ptr <X> x(y.release());
        a.addX(x);

        return 0;
}

在main函数中,我试图构建一个Y类型的对象,然后将其添加到一个X对象的向量中.但是,我不能直接说a.addX(y)为std :: unique_ptr< Y>无法转换为std :: unique_ptr< X>&.这就是为什么我想出了一个解决方法,我使用释放的内部指针y初始化另一个唯一指针x.

虽然这有效,但它似乎不是最好的解决方案.是否有更好的方法来传递std :: unique_ptr< Y>类型的对象?作为类型std :: unique_ptr< X>&amp ;?的参数

谢谢,
? – 斯坦

解决方法

std :: unique_ptr已经提供了正确的重载,但是你需要std :: move来使用它们,因为unique_ptr是不可复制的:

std::unique_ptr<X> x;
std::unique_ptr<Y> y { new Y };
x = std::move(y);

对于非常具体的问题,如果您需要通过引用接收unique_ptr子类,则无法进行转换,然后使用模板函数.

template < typename T,typename = typename std::enable_if< std::is_base_of<X,T>::value>::type >
void foo( std::unique_ptr<T> & ) {
}

最后,因为想法是获得指针的所有权,如果你通过rvalue引用传递unique_ptr,这可以按你的意愿工作.

void bar( std::unique_ptr<X> && ) {
}
// then
bar( std::move(y) );

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读