2017-01-23 89 views
5

我想要一個功能foo,該功能採用實現特徵A的類型的實例。我總是喜歡以使用泛型具有靜態調度:使用動態和靜態調度來實現特徵實現者的功能

trait A {} 

fn foo<T: A>(t: T) {} 

然而,這種方法引入了一些靈活性,我無法通過一個特質對象喜歡這裏:

trait A {} 

fn foo(t: &A) {} 

的事情是,有時我知道類型,有時不知道。有沒有一種方法可以爲編譯時間已知類型同時擁有對特徵對象的動態分派和靜態分派,同時又不會執行兩次?

回答

6

這確實是可能的。一種選擇是明確的實施A其引用類型:

impl<'a, T: A + ?Sized> A for &'a T {} 

的爭論變成特質對象時T = &A,同時還在做靜態調度爲A知實現者。下面的代碼現在應該編譯:

fn foo<T: A>(a: T) {} 

struct MyA; 
impl A for MyA {} 

fn main() { 
    foo(MyA{}); 
    foo(&MyA{}); 
    foo(&MyA{} as &A); 
} 

如果你願意總是傳遞借來的說法,你也可以做到這一點,而不是:

fn foo<T: A + ?Sized>(a: &T) {} 

的爭論成爲一個特質對象T = A時。

+0

我不確定我是否完全理解你的'fn foo'。 'Sized'上總是沒有隱含的限制嗎? – torkleyy

+1

@torkleyy在函數參數上,是的。這是可以的,因爲我們提供的是無論如何確實總是大小。第二個函數使用'&T',即使T不是,也可以調整大小。 –