我最近问this https://stackoverflow.com/questions/6328444/type-classes-in-d有关如何在 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();
}
当我运行此代码时,它会打印“generic”。所以我问是否有一些好的解决方法,以便可以从算法中使用更专门的形式。
我在有关类型类的问题中使用的解决方法是在导入具有模板专业化的所有文件后混合通用函数,但这有点丑陋且有限。
我听说 c++1x 将有 extern 模板,这将允许这样做。 D 有类似的功能吗?
我想我可以对这个问题做出正确的回答。不。
您想要做的是劫持 template.d 的功能(文件上的大小写也应该匹配并导入模板,某些操作系统很重要)。考虑:
// template.d
...
// spezialisation.d
import std.stdio;
import template;
void main() {
testTemplate!int();
}
现在有人更新了代码:
// specialization.d
import std.stdio;
import template;
import helper;
void main() {
testTemplate!int();
getUserData();
}
完美吧?井内助手:
// helper.d
getUserData() { ... }
template Generic(A:int) {
A placeholder; //...
}
现在,您仅通过导入更改了 professionalization.d 的行为,实际上这将无法编译,因为它无法调用 sayHello。这种劫持预防确实有其问题。例如,您可能有一个接受 Range 的函数,但库的使用者无法传递数组,除非您的库导入 std.array,因为这是数组“转换”为范围的地方。
我没有解决您问题的方法。
Michal 的评论为第二种形式的劫持提供了解决方案,其中表示 professionalization.d 试图劫持 getUserData
// specialization.d
import std.stdio;
import template;
import helper;
alias helper.getUserData getUserData;
string getUserData(int num) { ... }
void main() {
testTemplate!int();
getUserData();
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)