Is this meant to be possible?

Adam D. Ruppe destructionator at gmail.com
Mon Feb 17 16:39:32 PST 2014


On Tuesday, 18 February 2014 at 00:31:22 UTC, ted wrote:
> public interface IProvider
> {
>     string providedType();
>     T createInstance(T)();

This will cause the linker problem because templates cannot be 
virtual. This is declaring a final method in the interface that 
is never implemented.

The reason they can't be virtual is that an interface consists of 
an array of function pointers. Since templates might form 
multiple functions based on their compile-time arguments, the 
compiler can't know how many slots to reserve in that array for 
it.


What you can do is something like this:

interface IProvider {
    // this is a final method with an implementation right here
    T createInstance(T)() {
          auto i = cast(T) createDynamicInstance(typeid(T));
          if(i is null) throw new Exception("Couldn't create " ~ 
T.stringof);
          return i;
    }

    string providedType(); // virtual function
    Object createDynamicInstance(ClassInfo type); // virtual
}


Then in the class, implement createDynamicInstance based on the 
classinfo instead of the template. Your other code for add and 
get should continue to work.


More information about the Digitalmars-d-learn mailing list