C ++ 11闭包shared_ptr

时间:2015-10-09 08:41:38

标签: c++ c++11 lambda

通过shared_ptr创建堆分配闭包管理的语法是什么。我想将闭包传递给函数并能够传递nullptr。看起来像使用shared_ptr< ::std::function<void()>,但我无法想出从lambda expresion初始化它的语法

4 个答案:

答案 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);

在您的情况下,Xstd::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] ()
{
    ...
};

因此,闭包的数据在堆上并重新计数,同时可以复制和传递句柄。当最后一个句柄被销毁时,数据被清理。