指定泛型参数属于一小组类型

Specifying generic parameter to belong to a small set of types

是否可以将泛型参数限制为 select 少数类型之一,而无需弄清楚哪些特征精确定义了这些类型?例如

impl<T> Data<T> where T == u32 || T == u64 

有时弄清楚要添加到 where 的所有特征以获得您想要的类型是一件很乏味的事情,有时人们不想允许一种类型,即使它由于语义在句法上有意义。

您可以为要支持的类型使用标记特征:

trait DataSupported {}

impl DataSupported for u64 {}
impl DataSupported for u32 {}

impl<T> Data<T> where T: DataSupported {}

一样,如果你需要使用这个特征几个impls并且你需要其他特征边界,那么你可以将这些特征作为你的标记特征的边界,而不是,这将使您的 impl 简洁:

trait DataSupported: Num + Debug {}

您可以使用宏来添加基于类型列表的实现:

macro_rules! data_impl {
    ($($t: ty),+) => {
        $(
            impl Data<$t> {
                // methods go here
            }
        )+
    }
}

data_impl!(u32, u64, i32, i64);

可能值得向每个方法添加 #[allow(dead_code)] 以防止出现警告,因为如果您不将它们用于 [=17],您将定义许多可能不会在应用程序中使用的专用方法=]每个可能的类型。如果您在参数 T 上定义方法(称为单态化的过程),这与编译器无论如何都会做的事情完全相同。区别在于宏生成的方法是在编译器的解析步骤(在 linting 之前)定义的,而单态化发生在管道的后面。