我如何专门化不同模块的模板?
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
,将执行把戏。
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
,将执行把戏。