Я хотел бы создать функцию - давайте назовем ее foo
. Я хотел бы, чтобы эта функция принимала параметр predicate
, равный FnOnce
Предикат принимает один параметр t
- ссылка типа T
. Предикат возвращает будущее, которое захватывает t
время жизни.
Типичное значение predicate
может выглядеть следующим образом: fn predicate<'a>(instance: &'a SomeType) -> Future<Output = ()> + 'a
.
Хотя я могу достичь этого, используя границы времени жизни более высокого порядка и BoxFuture
:
fn foo_boxed<T, E, R>(predicate: E)
where
for<'a> E: FnOnce(&'a T) -> BoxFuture<'a, R> + Send + 'static,
R: Send + 'static,
{
}
Я бы хотел добиться того же результата, используя только дженерики. Похоже, синтаксис for<'a>
соответствует только ближайшему параметру, поэтому следующее не будет компилироваться:
fn foo_non_boxed_1<T, E, F>(predicate: E)
where
for<'a> E: FnOnce(&'a T) -> F + Send + 'static,
F: Future + Send + 'a, // 'a is undeclared here
F::Output: Send + 'static,
{
}
Внутри foo
Я хотел бы сохранить предикат для последующего использования и вызвать его из другого поток, передавая T
.
Есть ли способ добиться этого?