【发布时间】:2011-06-15 18:10:42
【问题描述】:
我最近向this 询问了有关如何在 D 中模拟类型类的问题,并提出了一种使用模板特化的方法。
我发现 D 无法识别不同源文件中的模板特化。因此,我不能只对定义通用函数的文件中未包含的文件进行专门化。为了说明,请考虑以下示例:
//template.d
import std.stdio;
template Generic(A) {
void sayHello() {
writefln("Generic");
}
}
void testTemplate(A)() {
Generic!A.sayHello();
}
//specialization.d
import std.stdio;
import Template;
template Generic(A:int) {
void sayHello() {
writefln("only for ints");
}
}
void main() {
testTemplate!int();
}
当我运行这段代码时,它会打印“通用”。所以我问是否有一些好的解决方法,以便可以从算法中使用更专业的形式。
我在关于类型类的问题中使用的解决方法是在导入所有具有模板专业化的文件后混合泛型函数,但这有点丑陋和有限。
我听说 c++1x 会有外部模板,这将允许这样做。 D有类似的特点吗?
【问题讨论】:
-
这在很大程度上是不允许的,原因包括避免不必要的功能劫持,例如如果
Generic是私有的,那么template.d不希望任何其他模板覆盖它可以做任意事情跨度> -
在specialization.d 中写“别名模板.Generic Generic”有帮助吗?这是强制功能劫持的方法d-programming-language.org/hijack.html