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