2015-10-09 23 views
8

Qual è la sintassi per creare heap allocato chiusura gestita da shared_ptr. Voglio passare le chiusure alle funzioni ed essere in grado di passare nullptr. Sembra come usare un shared_ptr< ::std::function<void()> ma non riesco a capire la sintassi per inizializzare che da una lambda expresionC++ 11 closure shared_ptr

risposta

5

Dovrebbe essere qualcosa di simile

auto lambda = []() { /* do something usefull */ }; 
auto p = std::make_shared<std::function<void()>>(lambda); 

Ma in realtà si può bisogno shared_ptr, dal momento che function può essere costruito da nullptr.

std::function<void()> fnc(nullptr); 
4

In generale, si desidera creare un shared_ptr<X> tramite make_shared, inizializzando l'oggetto X con l'oggetto Y. Poi in genere del codice per farlo è

auto ptr = make_shared<X>(someY); 

Nel tuo caso, X è il tipo std::function, e il someY è il vostro lambda. Una volta ottenuto ciò, è piuttosto semplice:

auto funPtr = std::make_shared<function<void()>>([](){ std::cout << "Hello World!\n"; }); 
(*funPtr)(); 
0

Preferisco mettere shared_ptr all'interno dell'oggetto funzione.

auto o = make_shared<MyData>(); 
return [o]() 
{ 
    ... 
}; 

Quindi, i dati per la chiusura è sul mucchio e ref-contato mentre il manico può essere copiato e passato intorno. I dati vengono ripuliti quando l'ultima maniglia viene distrutta.