【发布时间】:2015-10-09 08:41:37
【问题描述】:
创建由 shared_ptr 管理的堆分配闭包的语法是什么。我想将闭包传递给函数并能够传递 nullptr。似乎使用shared_ptr< ::std::function<void()>,但我无法确定从 lambda 表达式初始化它的语法
【问题讨论】:
创建由 shared_ptr 管理的堆分配闭包的语法是什么。我想将闭包传递给函数并能够传递 nullptr。似乎使用shared_ptr< ::std::function<void()>,但我无法确定从 lambda 表达式初始化它的语法
【问题讨论】:
应该是这样的
auto lambda = []() { /* do something usefull */ };
auto p = std::make_shared<std::function<void()>>(lambda);
但实际上你可能不需要shared_ptr,因为function可以由nullptr构造。
std::function<void()> fnc(nullptr);
【讨论】:
一般来说,你想通过make_shared创建一个shared_ptr<X>,用一些Y对象初始化X对象。然后通常执行此操作的代码是
auto ptr = make_shared<X>(someY);
在您的情况下,X 是 std::function 类型,someY 是您的 lambda。一旦你有了它,它就很简单了:
auto funPtr = std::make_shared<function<void()>>( [](){ std::cout << "Hello World!\n"; } );
(*funPtr)();
【讨论】:
您可以通过两种方式做到这一点:
std::function<void()> lambda = [](){};
auto heapPtr = std::make_shared<std::function<void()>>(lambda);
auto heapPtr2 = new std::function<void()>(lambda);
您可能还会发现以下问题很有用:
【讨论】:
我更喜欢将 shared_ptr 放在函数对象中。
auto o = make_shared<MyData>();
return [o] ()
{
...
};
因此,闭包的数据在堆上并被引用计数,而句柄可以被复制和传递。当最后一个句柄被销毁时,数据被清理。
【讨论】: