That's effectively the same as not requiring the type erasure at all, and I don't think there's any good ways to do that yet. There's partial workarounds,[1] but they tend to befuddle Rust's inference, and there aren't always enough knobs to guide closure inference in the face of unnameable, lifetime-capturing return types such as (unboxed) futures.[2] (Sometimes you can replace your closures with functions which have the requisite knobs.)
This is similar to this non-async thread, but with the added complication of unnameable types. If you push hard enough, maybe you could get inference to work with the closures.
But it's not going to be less work for callers than adding Box::pin; at best it'd be a macro you provide, I think.
e.g. you can construct bounds which are correct ↩︎
e.g. you can't meet the bounds with a closure because there's no way to convince the compiler to interpret the closure correctly ↩︎