2011-11-01 146 views
3

我知道模板像返回動態類型

T add(T)(T a, Tb){ 
    return a + b; 
} 

但這需要用戶問哪種類型將是回報,我,我想裏面的方法計算哪種類型會喜歡被退回:

T getField(size_t column){ 
    if(column == 0) 
     T = int; 
    else 
     T = string; 
    return to!T("1"); 
} 

我不知道我是否可以投反對票並改變原型。

感謝所有

+1

你打算用它做什麼? – GManNickG

回答

8

d,如C,C++,C#和Java是一種靜態類型語言。 所有類型必須在編譯時已知。所以,不,你不能做你想做的事情。

現在,您可以使用inheritance,unionsstd.variant.Variant來獲得一種動態類型的形式,但不像您想要做的那樣。這隻適用於動態語言。

  • 利用類,一類引用可以指向一個派生類的實例,而不是基類的引用是,這樣你就可以得到多態/動態行爲,但基類的類型在編譯時已知,以及任何參考所指的必須是是派生類型,因此必須是類。

  • 隨着工會,你可以有一個變量,它可以使用相同的內存不同類型(所以它一次只能是一種類型),但它通常被認爲是一個相當低層次的構造,並且最好避免並不需要它。工會不會跟蹤其當前類型,因此如果它可能是intstring,它很容易持有int,但將其用作string(反之亦然),從而導致討厭的錯誤。

  • 隨着Variant(這可能是你想使用的),你可以有一個變量可以容納不同的類型 - 類似於聯合 - 但你不指定它可以容納的類型(不像聯合),並且它實際上會跟蹤它目前所持有的類型(與union不同),因此使用起來更安全。

+1

很好的答案,但恕我直言變體(尤其是在工作中的新的一個)基本上是一個動態的輸入在D的實現。 – dsimcha

+0

謝謝std.variant解決我的問題謝謝 – bioinfornatics

+0

@dsimcha是的,'Variant'實質上是試圖實現動態在靜態類型之上打字,但動態類型不是真的被語言本身支持。 –