为实现特定类型特征的泛型类型实现特征

问题描述

这个问题的标题与许多相关问题非常相似,但我还没有找到讨论这个特定问题的问题。

我有一个 Color 类型,它的定义非常简单:

pub struct Color {
    red: u8,green: u8,blue: u8,}

现在,为了与其他库交互并转换为定点数,能够将其与包含任意数字类型的任何元组进行相互转换非常有用。

为此,我使用 the Az crate。它定义了特征 Cast<T> 并为很多类型实现了它,允许我像这样实现 From<(T,T,T)>

use az::Cast;
impl<T: Cast<u8>> From<(T,T)> for Color {
    fn from(components: (T,T)) -> Color {
        Color {
            red: Cast::cast(components.0),green: Cast::cast(components.1),blue: Cast::cast(components.2),}
    }
}

特征绑定为我提供了 Cast::<u8>::cast(T) 函数,所以一切都按预期进行。

但是,我似乎找不到实现相反的方法From<Color>。我真正想要的是:

impl<T> From<Color> for (T,T)
where
    impl Cast<T> for u8 // This doesn't actually work
{
    fn from(color: Color) -> (T,T) {
        (
            Cast::cast(color.red),Cast::cast(color.green),Cast::cast(color.blue),)
    }
}

但我似乎找不到真正写这个的方法。我检查了 docs on bounds,但似乎找不到可以表达这一点的语法。

我该如何实施?

解决方法

你很接近。其中边界采用与通用边界相同的语法:

impl<T> From<Color> for (T,T,T)
where
    // u8 must implement Cast<T>
    u8: Cast<T>,{
    fn from(color: Color) -> (T,T) {
        (
            Cast::cast(color.red),Cast::cast(color.green),Cast::cast(color.blue),)
    }
}