#[lang = "sized"] trait Sized {} pub trait Value { fn get(&self) -> i32; } struct Foo(i32); struct Bar(i32); impl Value for Foo { fn get(&self) -> i32 { self.0 } } impl Value for Bar { fn get(&self) -> i32 { self.0 } } pub fn foo(a: impl Value, b: impl Value) -> i32 { a.get() + b.get() } fn main() -> i32 { let a = Foo(1); let b = Bar(2); foo(a, b) - 3 }