立即回拨
考虑以下示例:
template <typename lambda> void call_me_back(const lambda & callback)
{
// Very complicated calculation to find the meaning of everything
callback(42);
}
int main()
{
call_me_back([](const int & value)
{
std :: cout << value << std :: endl;
});
}
在这里,我提供call_me_back
了一个接受int
. 经过长时间的计算后call_me_back
调用,并将其打印出来。轻松如蛋糕。callback
callback
现在,假设根据执行情况,call_me_back
需要callback
使用 anint
或其他类型调用。我们可以将前面的示例编辑为
template <typename lambda> void call_me_back(const lambda & callback)
{
// Very complicated calculation to find the meaning of everything
if(rand() % 2)
callback(42);
else
callback("Kill all the humans.");
}
int main()
{
call_me_back([](const auto & value)
{
std :: cout << value << std :: endl;
});
}
到目前为止,一切都很好。现在可以根据其类型callback
进行各种技巧和处理。value
延迟回调
现在,回到第一个例子。说call_me_back
没有准备好立即callback
用int
. 但是,它可以做的是存储某处callback
,然后再调用它。
例如:
std :: function <void(const int &)> the_callback;
template <typename lambda> void call_me_back(const lambda & callback)
{
the_callback = callback;
}
void ready_to_answer()
{
the_callback(42);
}
int main()
{
call_me_back([](const auto & value)
{
std :: cout << value << std :: endl;
});
}
现在,不是立即调用,而是callback
存储call_me_back
在callback
一个std :: function <void(const int &)>
对象中(我知道,它在全局范围内,请耐心等待)。然后可能会发生很多事情,并且在某些时候有人可以调用ready_to_answer
,它会检索先前存储的回调并调用它。例如,ready_to_answer
可以由另一个线程调用,但是有很多原因需要这样的范例,回调可以存储并稍后调用。
问题
如果我想实现第二个示例,但使用延迟回调怎么办?. 我似乎无法理解这一点。
我可以想象这std :: function
是使用接受某种特定类型的虚拟呼叫运算符实现的。然后std :: function
包装一个指向模板包装类的指针/引用,该模板包装类存储实际的 lambda,并通过将其参数转发给它正在存储的 lambda 来实现调用运算符。好,易于。但我不能有模板虚拟方法!
我试过想出各种解决方案,但我找不到任何可以合理工作的方法。这真的不可能吗?是否不可能有一些外部提供的 lambda 接受const auto &
存储在某处的参数,然后再调用它?