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