2014-01-13 48 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

相关问题