如何在D中重新创建类似std.conv.to的东西?

时间:2014-01-13 01:26:01

标签: templates d

我在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 管理它。

感谢。

2 个答案:

答案 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;
}