8

What is the syntax to create heap allocated closure manage by shared_ptr. I want to pass closures to functions and be able to pass nullptr. Seems like using a shared_ptr< ::std::function<void()> but I cannot figure the syntax to initialize that from a lambda expresion

4 Answers 4

5

It should be something like

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

But actually you may no need shared_ptr, since function can be constructed from nullptr.

std::function<void()> fnc(nullptr); 
Sign up to request clarification or add additional context in comments.

Comments

4

Generally speaking, you want to create a shared_ptr<X> via make_shared, initializing the X object with some Y object. Then generally the code to do that is

auto ptr = make_shared<X>(someY); 

In your case, X is the std::function type, and the someY is your lambda. Once you have that, it's pretty straight forward:

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

Comments

1

You can do it in two ways:

std::function<void()> lambda = [](){}; auto heapPtr = std::make_shared<std::function<void()>>(lambda); auto heapPtr2 = new std::function<void()>(lambda); 

You might also find the following questions useful:

Comments

0

I prefer putting shared_ptr inside the function object.

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

So, the data for the closure is on the heap and ref-counted while the handle can be copied and passed around. The data is cleaned up when the last handle is destroyed.

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.