std :: unique_ptr作为函数的out参数

时间:2015-02-26 07:42:38

标签: c++11 unique-ptr

struct cls{
    ~cls(){std::cout<<"dtor\n";}
};

void foo(cls** pp){
    *pp = new cls;
}

int main()
{
    cls* raw_ptr = 0;    
    foo(&raw_ptr);
    std::unique_ptr<cls> u_ptr{raw_ptr};
}

有没有办法直接访问raw_pointer中的unique_ptr传递给函数foo(cls** pp)

或者

cls* raw_ptr = 0;    
foo(&raw_ptr);
std::unique_ptr<cls> u_ptr{raw_ptr};

这是唯一的方式吗?

注意:我无法更改函数foo的签名。

2 个答案:

答案 0 :(得分:2)

您可以使用unique_ptr::get()unique_ptr内的指针进行只读访问。这将返回存储指针的副本。

但是,我理解你的问题是,是否有办法在unique_ptr 原位改变指针; 在这里,答案是 。你必须做你提到的原始到独特的舞蹈。

当然,即使你不能改变foo的签名,你当然可以提供自己的功能来包裹那个舞蹈。它甚至可能是foo的重载:

std::unique_ptr<cls> foo()
{
  cls *p = nullptr;
  foo(&p);
  return std::unique_ptr<cls>{p};
}

[Live example]

答案 1 :(得分:-1)

unique_ptr&lt;&gt; :: get() - 它返回一个指向所拥有对象的指针,而不释放该对象的所有权。