use std::fmt::Debug; use std::ops::Add; use dyn_derive::*; #[dyn_trait] pub trait Meta: Sized + Debug + Add {} #[derive(Debug)] pub struct MetaImpl(String); impl Meta for MetaImpl {} impl Add for MetaImpl { type Output = Self; fn add(self, rhs: Self) -> Self::Output { Self(self.0 + &rhs.0) } } pub struct Foo { meta: Box, } impl Add for Foo { type Output = Self; fn add(self, rhs: Self) -> Self::Output { Self { meta: self.meta + rhs.meta } } } #[test] fn main() { let foo1 = Foo { meta: Box::new(MetaImpl("114".into())) }; let foo2 = Foo { meta: Box::new(MetaImpl("514".into())) }; let foo3 = foo1 + foo2; assert_eq!(format!("{:?}", foo3.meta), "MetaImpl(\"114514\")"); }