我在D中有一个简单游戏的资产经理,我想制作一个简单的获取功能,以便获取!纹理(...)或 get!Sound(...)将是一个选项。我对模板很新,当我尝试它时,这并没有那么好用:
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语句之后,它似乎只接受了Texture的返回。其次,我不是if语句列表的忠实粉丝 - 有更好的方法可以做到这一点吗?我知道 std.conv.to 管理它。
感谢。
答案 0 :(得分:3)
你想要使用静态if:
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都可供检查(他们使用两者的组合)。
答案 1 :(得分: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;
}