繁体   English   中英

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

[英]Implement a trait for generic types that implement a trait for a specific type

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

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

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

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

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

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

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

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

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

但我似乎找不到真正写这个的方法。 我检查了bounds 上的文档,但似乎找不到允许表达这一点的语法。

我该如何实施?

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM