Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Templates 如何在D中重新创建类似std.conv.to的内容?_Templates_D - Fatal编程技术网

Templates 如何在D中重新创建类似std.conv.to的内容?

Templates 如何在D中重新创建类似std.conv.to的内容?,templates,d,Templates,D,我有一个D中一个简单游戏的资产管理器,我想做一个简单的get函数,这样get!纹理(…)或获取!声音(…)将是一种选择。我对模板相当陌生,在我尝试时,效果不是很好: 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 (...)

我有一个D中一个简单游戏的资产管理器,我想做一个简单的get函数,这样get!纹理(…)或获取!声音(…)将是一种选择。我对模板相当陌生,在我尝试时,效果不是很好:

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语句之后,它似乎只接受纹理的返回。第二,我不太喜欢if语句列表——有没有更好的方法来实现这一点?我知道std.conv.会处理好的


谢谢。

如果出现以下情况,您将希望使用静态:

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

无论哪种方式,都可以进行检查(他们同时使用了这两种方式)。

您需要这样的东西:

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

正确的术语是“模板约束”而不是“模板子句”,除非“模板子句”指的是模板上的
if
以外的内容,在这种情况下,我不知道您指的是什么。当我使用模板约束方法时,我得到错误“无法在编译时解释纹理”什么会导致这种情况?模板约束语法应该是
if(is(T:Texture))
@棘轮怪物
静态if
s需要相同的更改,通常最好使用
is(T==Type)
而不是
is(T:Type)
,因为隐式转换可能会导致问题,在这种特殊情况下,
T:Type
实际上是错误方向的隐式转换,因为您返回的是
T
,而不是
Type
Type
不一定隐式转换为
T
(如果
Type
实际上
t
,则可能不会,因为隐式转换通常不会双向进行)。