1

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

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

有时要弄清楚要添加哪些特征才能where获得所需的类型很乏味,有时即使由于语义而具有语法意义,也不想允许类型。

4

2 回答 2

2

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

trait DataSupported {}

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

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

正如Pavel Strakhov 所提到的,如果您需要使用此 trait 几个impls 并且您需要其他 trait bound,那么您可以将这些特征作为您的标记 trait 的边界,这将保持您impl的简洁:

trait DataSupported: Num + Debug {}
于 2017-02-22T01:56:36.147 回答
0

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

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

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

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

于 2019-01-22T12:58:27.537 回答