在C中的unique_ptr之间进行转换

在C中的unique_ptr之间进行转换,第1张

概述我有以下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::u 我有以下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> && ) {}// thenbar( std::move(y) );
@H_301_44@ 总结

以上是内存溢出为你收集整理的在C中的unique_ptr之间进行转换全部内容,希望文章能够帮你解决在C中的unique_ptr之间进行转换所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1215768.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存