Lambda引用自己

时间:2018-04-14 16:34:28

标签: c++ lambda function-pointers

假设我有一个像这样的全局函数指针:

void (*Callback)(My_special_t*);

如果我想给它分配一个lambda,我会这样做:

Callback = [](My_special_t* instance) { 
   //Useful stuff
};

我真正想做的是这样的事情:

Callback = [](My_special_t* instance) { 
   //Useful stuff
   Callback = /* Somehow get the current lambda? */
};

所以我的问题是:

是否有可能从内部引用一个lambda对象.....如果是这样的话?

2 个答案:

答案 0 :(得分:1)

我知道lambda是非常酷的功能,因为它很酷,它被过度使用。 在这里尝试强制lambda会产生问题。

只需定义一个功能,问题就解决了。

void myNiceFunction(My_special_t *instance) {
    instance->doStuff();

    … … …

    if (instance->next) {
        myNiceFunction(instance->next);
    }
}

它更好,因为它是自我记录(如果提供好名称)并且它是可测试的(测试可以直接到达此功能)。

答案 1 :(得分:0)

您可以使用std::function执行此操作,如下所示:

#include <functional>
#include <iostream>

using std::cout;
using std::function;

struct My_special_t
{
};

int main()
{
  function<void(My_special_t*)> Callback;

  auto otherCallback = [](My_special_t* instance)
  {
    cout << "otherCallback " << static_cast<void*>(instance) << "\n";
  };

  Callback = [&Callback, &otherCallback](My_special_t* instance)
  {
    cout << "first callback " << static_cast<void*>(instance) << "\n";
    Callback = otherCallback;
  };

  My_special_t special;
  Callback(&special);
  Callback(&special);
}