abstract function templates

Ali Çehreli acehreli at yahoo.com
Tue Dec 28 10:17:42 PST 2010


Andrej Mitrovic wrote:
 > I think this is relevant:
 > http://www.digitalmars.com/d/2.0/template.html : "Limitations":
 >
 > Templates cannot be used to add non-static members or virtual
 > functions to classes.
 > Templates cannot add functions to interfaces.
 >
 > But I'm a little confused as to how it all works out. This will work:
 >
 > import std.stdio;
 >
 > class Foo
 > {
 >     void draw(T)(T t) { writeln("Foo"); };
 > }
 >
 > class Bar : Foo
 > {
 >     /* override */ void draw(T)(T t) { writeln("Bar"); };
 > }

Bar.draw does not override, but "hide" Foo.draw. They are unrelated 
functions.

 > void main()
 > {
 >     Bar bar = new Bar();
 >     bar.draw(1); // "Bar"

Bar.draw!int is called. No virtual dispatch is involved, as Foo.draw!int 
doesn't even exist.

 >     (cast(Foo)bar).draw(1); // "Foo"

Now Foo.draw!int is instantiated (at compile time) an is called. There 
is no Bar.draw!int instantiated at all.

 > }
 >
 > But uncomment the override and it fails.

That's because "Templates cannot be used to add [...] virtual functions 
to classes"

Ali


More information about the Digitalmars-d-learn mailing list