42 lines
697 B
Rust
42 lines
697 B
Rust
|
// check-pass
|
||
|
|
||
|
use std::marker::PhantomData;
|
||
|
|
||
|
trait Family: Sized {
|
||
|
type Item<'a>;
|
||
|
|
||
|
fn apply_all<F>(&self, f: F)
|
||
|
where
|
||
|
F: FamilyItemFn<Self> { }
|
||
|
}
|
||
|
|
||
|
struct Array<T>(PhantomData<T>);
|
||
|
|
||
|
impl<T: 'static> Family for Array<T> {
|
||
|
type Item<'a> = &'a T;
|
||
|
}
|
||
|
|
||
|
trait FamilyItemFn<T: Family> {
|
||
|
fn apply(&self, item: T::Item<'_>);
|
||
|
}
|
||
|
|
||
|
impl<T, F> FamilyItemFn<T> for F
|
||
|
where
|
||
|
T: Family,
|
||
|
for<'a> F: Fn(T::Item<'a>)
|
||
|
{
|
||
|
fn apply(&self, item: T::Item<'_>) {
|
||
|
(*self)(item);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
fn process<T: 'static>(array: Array<T>) {
|
||
|
// Works
|
||
|
array.apply_all(|x: &T| { });
|
||
|
|
||
|
// ICE: NoSolution
|
||
|
array.apply_all(|x: <Array<T> as Family>::Item<'_>| { });
|
||
|
}
|
||
|
|
||
|
fn main() {}
|