在下面的代码,我期望的输出是为什么这些模板化功能不像虚拟功能?
B
C
但令人沮丧的足够它是
A
C
有什么我可以做,以使其行为我期待的方式吗?为什么这种行为首先发生?
我辞职自己定义的stuff
混入模板,并在每类中的覆盖写入,这解决了这个问题,但是是一个丑陋的黑客IMO相混合。
import std.stdio : writeln;
class A {
void write() {
stuff();
}
void stuff()() {
writeln("A");
}
}
class B : A {
void stuff()() {
writeln("B");
}
}
class C : A {
void write() {
stuff();
}
void stuff()() {
writeln("C");
}
}
void main (string[] args) {
B b = new B();
b.write();
C c = new C();
c.write();
}
在'的东西()()',第一组括号将包含模板参数,在这种情况下,他们是空的,但它仍然计数。我也使用语法糖作为'b.stuff()'而不是完整的'b.stuff!()()' – 2012-01-06 02:56:13
(谢谢@Jean,我已经删除了我原来的评论,因为它是完全的我想我有一次关于D模板的新东西,但我已经忘了这一切!) – 2012-01-06 03:00:17
好吧,通过添加空模板参数来使模板函数成为模板的技巧可能不会出现在大多数人身上。它的主要用途是解决不允许使用非模板化函数重载模板化函数的问题。所以,从长远来看,这可能不是一个特别有用的功能。 – 2012-01-06 03:05:25