2016-03-02 44 views
0

我有一个原始指针,并希望回调拥有它。我拿出这个代码:这是使用unique_ptr的正确方法吗?

A* a = new A(); 
dosomething(callback(unique_ptr<A>(a).get())) 

// The callback always takes a raw pointer. 
void callback(A* a) { 
} 

这是正确的方法吗?

+0

你到底想干什么?你在期待你的智能指针在这种情况下做什么? – Galik

+0

由于'callback'不能返回任何东西,所以不能调用'dosomething(callback(...))'。由于'callback'应该是一个回调函数,所以你可能需要这样做:'sosomething([a](){/ * callback * /});'?也许我可以帮助,如果我知道'dosomething'预期的类型。 – JojOatXGME

+0

@ Kupiakos:你写了我正要写的答案,作为评论。我建议你让它成为答案。 ;-)或许就如何以一种好的方式来做事情也许增加一些建议。 –

回答

1

不,callback不拥有它。但是,在dosomething完成后,它将被销毁。

如果您构建dosomething采取的回调和A *,然后有dosomething呼叫callback给定A *作为参数,它可以工作,只要创建它的执行过程中只使用了unique_ptr

例子:

void callback(A *a) 
{ 
    if (!a) return; 
    std::cout << "Got A " << a->name() << std::endl; 
} 

void dosomething(const std::function<void(A *)> &func, std::unique_ptr<A> obj) 
{ 
    std::cout << "Doing some operation..." << std::endl; 
    func(obj.get()); 
} 

int main() 
{ 
    dosomething(callback, std::make_unique<A>()); 
} 
0

我将简化整个事情并使用std::shared_ptr

auto a = std::make_shared<A>(); 
callback(a); 

这将要求你申报callback是一种能够在首位获得std::shared_ptr

当然

,这是一个有点奇怪的是callback不返回任何东西..

相关问题