On Friday, 22 September 2017 at 12:16:52 UTC, Steven
Schveighoffer wrote:
On 9/21/17 4:32 PM, Jean-Louis Leroy wrote:
It did not take long! Someone tried to create templatized open
methods and it didn't work right of the box. I expected that,
but in fact there may be a bit of hope. You cannot have
virtual function templates in C++ or in D because the layout
of the vtables have to be known at compile time - but
openmethods creates its method tables at runtime so maybe it
can be made to work.
I stumbled upon a problem very quickly: it seems that classes
that come from class template instantiations are not
registered in ModuleInfo - see below,
import std.stdio;
class Foo {}
class Bar(T) : Foo
{
int i;
}
alias BarInt = Bar!int;
const barInt = new BarInt;
void main()
{
foreach (mod; ModuleInfo) {
foreach (c; mod.localClasses) {
writeln(c);
}
}
}
....output:
modtemp.Foo
core.exception.RangeError
core.exception.AssertError
etc...
Neither 'Bar!int' nor 'BarInt' appear in 'localClasses'.
Ideas?
It used to be that classes were always in ModuleInfo (and that
ModuleInfo was always generated). That's not so much the case
any more, as there has been a push to reduce the runtime
footprint and complexity (especially toward -betterC). This
makes traditional runtime reflection more difficult and
sporadic.
However, I would expect that if ModuleInfo is generated for a
file, and some classes are added, then ALL classes instantiated
in the module should be added.
I would say it's a bug.
-Steve
aliases are not symbol so it's expected that 'BarInt' doesn't
appear in the items.
Would "Bar!int" be usable in Object.factory ?