С enum_dispatch
ящиком вы можете написать
#[macro_use]
extern crate enum_dispatch;
#[enum_dispatch]
trait Foo {}
struct FooA {}
impl Foo for FooA {}
struct FooB {}
impl Foo for FooB {}
struct FooC {}
impl Foo for FooC {}
#[enum_dispatch(Foo)]
enum Foos {
A(FooA),
B(FooB),
C(FooC),
}
, чтобы получить сгенерированный impl Foo for Foos
. Затем вы можете конвертировать Foos
в Box<dyn Foo>
просто Box::new
.
У этого подхода есть потенциальная обратная сторона: Box::new(Foos::A(FooA))
содержит Foos
, а не FooA
, поэтому он потребует дополнительных затрат при динамической диспетчеризации от dyn Foo
до Foos
и enum
отправка от Foos
до FooA
.
С другой стороны, теперь, когда у вас есть impl Foo for Foos
: везде, где вы использовали бы Box<dyn Foo>
, вы вместо этого сможете напрямую использовать Foos
, что должно быть более эффективным во всех отношениях.