指定泛型参数属于一小组类型
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 {}
与一样,如果你需要使用这个特征几个impl
s并且你需要其他特征边界,那么你可以将这些特征作为你的标记特征的边界,而不是,这将使您的 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 之前)定义的,而单态化发生在管道的后面。
是否可以将泛型参数限制为 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 {}
与impl
s并且你需要其他特征边界,那么你可以将这些特征作为你的标记特征的边界,而不是,这将使您的 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 之前)定义的,而单态化发生在管道的后面。