2017-02-22 60 views
1

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

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

有时候很繁琐找出所有特征添加到where得到你想要的类型,有时是不希望允许类型,即使它使因为语义句法感。

+0

*有时候很繁琐找出所有特征添加到哪里得到你想要*的类型 - 有时它的单调乏味地得到明确的代码当某些任意类型决定重新命名一个方法时,它依赖它并且不会神秘失败;我认为这是一件好事**。铁锈不是去。自动推断特征中的成员资格并不是一件好事,因为函数的*特征*不是构成由特征推断的合约的唯一东西。有些方面不能用代码表达,这就是为什么人类必须应用特质。 – Shepmaster

+0

我同意。我在这里的特殊用例并不是那种时候,因为它使得人们必须更深入地看清楚高层用例在理论上应该要求的(例如,不使用外部箱子的整数的数值特征) '1..n'需要一个特征,'std :: ops :: Add'的类型签名可以支持'a + b + c'开始变得更深,然后你意识到'Zero'的特征不是稳定。 FWIW我分享“去”的观点。 – divbyzero

回答

2

你可以使用一个标记性状为你想要支持的类型:

trait DataSupported {} 

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

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

由于Pavel Strakhov mentioned,如果你需要使用这种特质几impl S和需要其他特质界限,那么你就可以只是让这些特质作为标记性状的边界,而不是,这将让您的impl小号简洁:

trait DataSupported: Num + Debug {} 
+0

实际上这会导致问题,因为编译器不会推断这些类型实现的常见特征组,因此您必须单独放置每个边界 – divbyzero

+1

您可以执行类似于“trait DataSupported:Display + Debug {}”的操作,然后写入全部你需要的特质。你不必在'impl's中列出这些特征。 –

+0

@PavelStrakhov谢谢,我会更新我的答案。 –