在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>& ;?的参数 谢谢, 解决方法
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) ); (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |