通过shared_ptr创建堆分配闭包管理的语法是什么。我想将闭包传递给函数并能够传递nullptr。看起来像使用shared_ptr< ::std::function<void()>
,但我无法想出从lambda expresion初始化它的语法
答案 0 :(得分:5)
应该是
auto lambda = []() { /* do something usefull */ };
auto p = std::make_shared<std::function<void()>>(lambda);
但实际上您可能不需要shared_ptr
,因为function可以从nullptr
构建。
std::function<void()> fnc(nullptr);
答案 1 :(得分:4)
一般来说,您希望通过shared_ptr<X>
创建make_shared
,并使用某个X
对象初始化Y
对象。那么通常代码就是
auto ptr = make_shared<X>(someY);
在您的情况下,X
是std::function
类型,someY
是您的lambda。一旦你有了,那就非常直接了:
auto funPtr = std::make_shared<function<void()>>( [](){ std::cout << "Hello World!\n"; } );
(*funPtr)();
答案 2 :(得分:1)
您可以通过两种方式实现:
std::function<void()> lambda = [](){};
auto heapPtr = std::make_shared<std::function<void()>>(lambda);
auto heapPtr2 = new std::function<void()>(lambda);
您可能还会发现以下问题非常有用:
答案 3 :(得分:0)
我更喜欢将shared_ptr放在函数对象中。
auto o = make_shared<MyData>();
return [o] ()
{
...
};
因此,闭包的数据在堆上并重新计数,同时可以复制和传递句柄。当最后一个句柄被销毁时,数据被清理。