Templates and virtual functions

BCS ao at pathlink.com
Wed Jan 21 12:57:12 PST 2009


Reply to dsimcha,

> Every once in a while, it comes up on this NG that a significant
> limitation of templates is that they can't add virtual functions 
> to classes.  Of course, removing this limitation for the general
> case is impossible w/o completely changing the compilation
> model in ways that are bad ideas for other reasons.
> However, would it be reasonable to allow _specific instantiations_ of
> templates to add virtual functions?  This might be a nice convenience
> feature.
> Below is an illustration.
>
> class foo {
> T nothing(T)(T arg) {  // Non-virtual.
> return arg;
> }
> virtual nothing!(int);  // Add nothing!(int) to foo's vtable.
> virtual nothing!(float);  // Add nothing!(float) to foo's vtable.
> }
>
> class bar : foo {
> // float, int instantiations override those of foo.
> // Any others are non-virtual and don't override those of foo.

Having this distinction could be a problem because it might make it hard 
to tell if a function is or is not virtual and also would make tweaking the 
list in a base class risky.

> T nothing(T)(T arg) { return 2 * arg; }
> }
> class baz : foo {
> int nothing(int arg) {  /* overrides foo.nothing!(int) */ return 3 * arg; }
> float nothing(float arg) {  /* overrides foo.nothing!(float) */ return 
3 * arg; }
> }
>
> Using the virtual keyword, one could add specific instantiations of a
> template to a class's vtable.  Then, these functions would
> automatically work just like non-template virtual functions.  My guess
> (I'm not an expert on compiler internals) is that this would be easy
> to implement, yet would help in a lot of cases where only a few
> instantiations even make sense.  Of course, the compiler would throw
> an error when two instantiations differed only by return type, just as
> with non-template functions.
> 

I think you are right in that it would be easy to implement because I think 
you could reduce it to an alias declaration. OTOH I think you would get most 
of what you are proposing with some sugar around alias.





More information about the Digitalmars-d mailing list