2014-01-13 50 views
3

我有一個資產管理器爲一個簡單的D遊戲,我想做一個簡單的得到函數,以便得到!紋理(...)get!Sound(...)將是一個選項。我是相當新的模板,當我試圖這樣沒有工作這麼好:如何在D中重新創建類似std.conv.to的東西? (...)

T get(T) (string p_name) 
{ 
    if (T is Texture) 
     return _textures[p_name]; 
    else if (T is Sound) 
     return _sounds[p_name]; 
    else if (...) 
      ... 
    else 
     return null; 
} 

首先,這是因爲第一個return語句後沒有編譯,它似乎只接受退貨紋理。其次,我不是那些陳述清單的忠實粉絲 - 是否有更好的方式去做這件事?我知道std.conv.to管理它。

謝謝。你會想用靜若

回答

3

你需要的東西是這樣的:

T get(T) (string p_name) 
{ 
    static if (is(T : Texture)) 
     return _textures[p_name]; 
    else static if (is(T : Sound)) 
     return _sounds[p_name]; 
    else static if (...) 
      ... 
    else 
     return null; 
} 
3

T get(T) (string p_name) 
{ 
    static if (is(T == Texture)) 
     return _textures[p_name]; 
    else if (is(T == Sound)) 
     return _sounds[p_name]; 
    else if (...) 
      ... 
    else 
     return null; 
} 

或模板約束

T get(T) (string p_name) if (is(T == Texture)){ 
    return _textures[p_name]; 
} 
T get(T) (string p_name) if (is(T == Sound)){ 
    return _sounds[p_name]; 
} 
T get(T) (string p_name) if (is(T == ...)){ 
    return ...; 
} 
T get(T) (string p_name) 
    return null; 
} 

無論哪種方式的source of std.conv可供查閱(他們使用的兩個的組合)。

+0

正確的術語是「模板約束」,而不是「模板條款」,除非意味着什麼是「模板條款」不是模板上的'if'等,在哪種情況下我不知道你指的是什麼。 –

+0

不是它的限制;我想不出名字 –

+0

當我使用模板約束方法時,出現錯誤「無法在編譯時解釋紋理」。什麼會造成這種情況? – patrickjm

相關問題