为 std::function 创建闭包

Creating a closure for std::function

我不确定我是否使用了准确的术语,但我会尽量描述清楚以消除任何混淆。

假设我有一个 std::function 变量

std::function<void(int)>  callback ;

由于某些超出我的范围的原因,我无法更改函数原型。 我在代码中的某个时刻收到 std::function 变量,我必须像这样调用 it.Something :

int a = 10 // just an example value
callback(a); 

现在我有了另一个变量。我们将其命名为 id .

int id = rand(); // Let us assume that rand here generates a random variable
int a = 10 // just an example value
callback(a);

我希望 id 可以在回调中访问,即我正在寻找某种形式的闭包。 有没有办法做到这一点而不使 id static/global.

不,你不能那样做。

callback 没有状态,除非它被设计为具有状态(实际上没有)。

不过这应该无关紧要:如果您无法控制 callback,那么它已经不想使用您的变量 id。如果您 do 可以控制它,那么您可以简单地用一个 lambda 替换它,该 lambda 确实捕获变量并用它做任何您想做的事情。

您可以更改 std::function:

std::function<void(int)> callback;
int id = rand();
callback = [=](int a){callback(a*id);};

我在这里使用 lambda 来创建一个新的未命名函数。这需要 idcallback(你得到的那个)的副本 [=],然后我将 lambda 分配回原始 callback

请注意,这也会复制 id。该示例非常有限,我无法确定 id 的生命周期是否足够长。您可以通过引用捕获,但与 C++ 中的所有引用一样,您需要注意引用对象的生命周期。