如何使用动态泛型编写结构?

How do I write a struct with dynamic generics?

假设我有以下结构

trait T{}
struct A<X:T>{
    ...
}

我想知道这样的事情是否可行

Box<A<dyn T>>

目前我遇到错误

the trait `Sized` is not implemented for `(dyn T + 'static)`

但是当我添加

trait T:Sized{}

我明白了

the trait cannot be made into an object because it requires `Self: Sized`

这是可能的,但是泛型在默认情况下具有 Sized 绑定,这会阻止它们被未确定大小的特征对象实例化。您需要指定 T: ?Sized:

trait T {}
struct A<X: ?Sized + T> {}

例如:

trait T {}
impl T for () {}

struct A<X: ?Sized + T> {
    value: X,
}

fn foo() {
    let _ = Box::<A<()>>::new(A { value: () }) as Box<A<dyn T>>;
}

Playground.