interface I1 { ... }
interface I2 { ... }
struct List(T) { ... }
如何使我的List专门用于仅实现 I1和I2的类?一个界面很简单:
struct List(T : I1)
其他语言。在C#中它是:
struct List<T> where T : I1, I2
在Java中我会说:
class List<T extends I1 & I2>
一个问题:我不想要 if 模板约束,因为我希望从非最先进的IDE中合理地自动完成。我认为在D的IDE之前要做的事情就是反向工程模板约束以推导出可能的T列表方法。即使这听起来并不像表现便宜。
答案 0 :(得分:3)
如果你不想用if语句约束模板,那么只有这样:
struct List(T : I1, U : I2 = T) { }
这意味着您可以使用一个或两个参数实例化List,如果仅实例化一个 - List!(C),那么U将默认分配值C,并检查它是否实现了I2。然后,您可以忽略结构中的参数U.此方法的问题是您使用两个参数实例化List:List!(C1,C2)...
这是带有if约束的版本,它没有这个问题:
struct List2(T) if ( is(T : I1) && is(T : I2)) { }
如果您不计算大量数据(如ct raytracer或查找表),使用if模板约束或任何编译时技术都没有实际的性能开销
我真的建议你不要将你的代码限制在IDE支持的范围内 - 肯定会有很多东西你的IDE不能很好地支持你可能会发现自己没有使用简单的文本编辑器而只有sintax的亮点,但具有D的全部潜力。
答案 1 :(得分:2)
在D2中,您可以使用template constraints和is
表达式。
struct List(T)
if (is(T : I1) && is(T : I2))
{
...
}
此处,is
表达式会检查T
是否可隐式转换为I1
和I2
(仅当T
实现它们时才可以)。< / p>