Fantastic !! (thanks !) so is: createDynamicInstance(ClassInfo type) { return type.create(); } the correct implementation ?? - it certainly seems to work...
Adam D. Ruppe wrote: > 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.