有没有一种优雅的方法可以在没有 PhantomData 的情况下使用未使用的类型制作通用元组结构?

Is there an elegant way to make a generic tuple struct with an unused type without PhantomData?

我想创建一个通用元组结构 Producer,它可以容纳任何类型 P,它实现了下面定义的特征 Produce<T>。这会产生(预期的)注释错误:

trait Produce<T> {
    fn get(&mut self) -> T;
}

// ERROR: parameter `T` is never used [E0392]
struct Producer<P,T>(P) where P: Produce<T>;

如果这是一个非元组结构,我可以通过添加一个 PhantomData<T> 字段并编写一个构造函数 Producer::new(p: P) 来解决这个问题,以将其隐藏为实现细节。但是,我在 Builder API 中使用这种类型作为元组结构家族之一,因此使用传统的结构 + 构造函数感觉很不合适。

有什么办法可以实现吗?

在许多情况下,您不想参数化您的特征,而是想要一个关联类型:

trait Produce {
    type T;

    fn get(&mut self) -> Self::T;
}

struct Producer<P>(P) where P: Produce;

fn main() {}

不幸的是,如果不了解更多关于预期用例和代码示例的信息,很难判断这是否适合您,这对于 Stack Overflow 来说可能过于冗长。