为 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 来创建一个新的未命名函数。这需要 id
和 callback
(你得到的那个)的副本 [=]
,然后我将 lambda 分配回原始 callback
。
请注意,这也会复制 id
。该示例非常有限,我无法确定 id
的生命周期是否足够长。您可以通过引用捕获,但与 C++ 中的所有引用一样,您需要注意引用对象的生命周期。
我不确定我是否使用了准确的术语,但我会尽量描述清楚以消除任何混淆。
假设我有一个 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 来创建一个新的未命名函数。这需要 id
和 callback
(你得到的那个)的副本 [=]
,然后我将 lambda 分配回原始 callback
。
请注意,这也会复制 id
。该示例非常有限,我无法确定 id
的生命周期是否足够长。您可以通过引用捕获,但与 C++ 中的所有引用一样,您需要注意引用对象的生命周期。