
trait Cloneable[+T <: AnyRef]:
def test_clone(): T
case class Foo() extends Cloneable[Foo]:
override def test_clone() = this.copy()
case class Bar()
case class Wrapper[T](value: T)
extension [T <: Cloneable[T]](x: Wrapper[T])
def test_clone(): Wrapper[T] = Wrapper(x.value.test_clone())
def main() =
val foo = Wrapper(Foo())
val bar = Wrapper(Bar())
foo.test_clone()
bar.test_clone() // can't compile
main()
#[derive(Clone)]
struct Foo {
}
struct Bar {
}
struct Wrapper<T> {
pub value: T,
}
impl<T> Clone for Wrapper<T> where T : Clone {
fn clone(&self) -> Self {
return Wrapper {
value: self.value.clone()
}
}
}
fn main() {
let foo = Wrapper {
value: Foo {}
};
let bar = Wrapper {
value: Bar {}
};
clone(foo); // ok
clone(bar); // won't compile
}
fn clone<T: Clone>(clonable: T) -> T {
return clonable.clone()
}
std::enable_if_t<std::is_same<T,decltype(a.clone())>::value,int>;
&& std::same_as<T,decltype(((T*)nullptr)->clone())>