async fn
возвращает реализованный анонимный тип Future
, поэтому, если мы хотим использовать его в качестве обратного вызова, нам нужно преобразовать возвращаемое значение в объект-признак.
Я пытался написать функцию, чтобы сделать это, но у меня были некоторые проблемы на всю жизнь.
async fn
вернет время жизни всех параметров, так что подпись обратного вызова также должна. Как я могу добавить время жизни к возвращаемому значению обратного вызова?
use futures::future::{Future, FutureExt, LocalBoxFuture};
type Context = ();
type AsyncCb = Box<dyn for<'r> FnOnce(&'r Context) -> LocalBoxFuture<'r, ()>>;
fn normalize_async_cb<Fut: Future<Output = ()>>(f: for<'r> fn(&'r Context) -> Fut) -> AsyncCb
// how to add 'r for Fut? ^^^
{
let cb = move |ctx: &Context| f(ctx).boxed_local();
Box::new(cb)
}
Кроме того, что вы подразумеваете под "обратным вызовом"? Можете ли вы привести пример, показывающий, где вам понадобится этот тип обратного вызова?
—
Кодер-256
normalize_async_cb
указателя функции?