【问题标题】:C++11 closure shared_ptrC++11 闭包 shared_ptr
【发布时间】:2015-10-09 08:41:37
【问题描述】:

创建由 shared_ptr 管理的堆分配闭包的语法是什么。我想将闭包传递给函数并能够传递 nullptr。似乎使用shared_ptr< ::std::function<void()>,但我无法确定从 lambda 表达式初始化它的语法

【问题讨论】:

    标签: c++ c++11 lambda


    【解决方案1】:

    应该是这样的

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

    但实际上你可能不需要shared_ptr,因为function可以由nullptr构造。

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

    【讨论】:

      【解决方案2】:

      一般来说,你想通过make_shared创建一个shared_ptr&lt;X&gt;,用一些Y对象初始化X对象。然后通常执行此操作的代码是

      auto ptr = make_shared<X>(someY);
      

      在您的情况下,Xstd::function 类型,someY 是您的 lambda。一旦你有了它,它就很简单了:

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

      【讨论】:

        【解决方案3】:

        您可以通过两种方式做到这一点:

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

        您可能还会发现以下问题很有用:

        【讨论】:

          【解决方案4】:

          我更喜欢将 shared_ptr 放在函数对象中。

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

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2012-10-05
            • 2014-04-15
            • 1970-01-01
            • 2016-01-26
            • 2017-05-01
            • 1970-01-01
            • 1970-01-01
            • 2012-12-04
            相关资源
            最近更新 更多