On 2013-08-11, 20:33, JS wrote:
I think you're missing the point to some degree(I realize there is a
diff between an object and a type, but I should be able to easily get
the class size of an object at run time regardless if the object is
typed as a base class). The code below does this, but at a cost of
verbosity.
Here is code that exactly demonstrates what I am essentially trying to
do. The only drawback now is having to mixin the template for each class
which I would want to automate and it would be nice to wrap the RT and
CT methods in subclasses without overhead.
It would appear that some information is lost when calling typeid from an
interface. I would have expected this to work:
interface I {
final
size_t size() {
return typeid(this).init.length;
}
}
class A {}
class B : A, I {
int a;
}
void test1() {
I i = new B();
assert(i.size > 0); // Fails.
}
A bit more experimentation shows:
void test2() {
B b = new B();
I i = b;
A a = b;
assert(typeid(a) == typeid(b)); // Passes.
assert(typeid(i) == typeid(b)); // Fails.
assert(typeid(b).init.length > 0); // Passes.
assert(typeid(i).init.length > 0); // Fails.
}
It appears thus that the error is in typeid(interface), which does not
give the actual typeid.
The workaround is as follows:
interface I {
final
size_t size() {
return typeid(cast(Object)this).init.length;
}
}
Is this what you want? Is it good enough? I have no idea, as you're
notoriously bad at describing what you want, but pretty good at
attacking people.
If you're looking for a no-overhead solution, then this might not be
good enough. I'm surprised that a virtual function call is fine,
though.