我如何专门化不同模块的模板?

How do I specialize templates across different modules?

module a;
void foo(T)(){
    import std.stdio;
    writeln(T.stringof);
}

module b;
import a;

private alias foo = a.foo;
void foo(T: int)(){
    import std.stdio;
    writeln("Special int");
}
//app.d
void main()
{
    import a;
    import b;
    foo!int();
}

这会打印 int 而不是 Special Int。是否可以跨不同模块专门化模板?

我可以假设 D template specialization in different source file 的答案今天仍然适用吗?

您的别名错误并且您的导入引入了歧义。如果您希望它 public 可以重载,请不要将别名设为私有!

一旦创建了别名 public(顺便说一句,默认),编译它会吐出一个名称冲突错误:

iii.d(6): Error: a.foo(T)() at ii.d(2) conflicts with b.foo at i.d

然后,只需消除歧义(指定 b.foo!int()),或者更好的是,从使用点中删除不必要的 import a

//app.d
void main()
{
    import b;
    foo!int();
}

特殊整数!

对于更复杂的情况,您还可以为模板制作一个包装器并转发您的参数,但这里简单的别名重载 - 当使用 alias foo = a.foo; 完成时,没有 private,将执行把戏。