2017-02-22 40 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謝謝,我會更新我的答案。 –

相關問題