如何在不同模块之间专门化模板?

时间:2016-07-28 09:51:42

标签: d

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的答案今天仍然有用吗?

1 个答案:

答案 0 :(得分:1)

你的别名错了,你的导入引入了歧义。如果您希望公开过载,请不要将别名设为私有!

一旦别名被公开(默认btw),编译它会吐出名称冲突错误:

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

Special int!

对于更复杂的情况,你也可以为模板创建一个包装器并转发你的参数,但是这里简单的别名重载 - 当用alias foo = a.foo;完成时,没有private,就可以了。