ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

在C中的unique_ptr之间进行转换

2019-07-28 17:09:14  阅读:141  来源: 互联网

标签:c c11 unique-ptr coding-style


我有以下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) );

标签:c,c11,unique-ptr,coding-style
来源: https://codeday.me/bug/20190728/1563748.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有