On Sunday, 11 August 2013 at 19:08:58 UTC, Simen Kjaeraas wrote:
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.
I attack people because they are arrogant bastards. They do
nothing to help but only contribute to the chaos. They deserve to
be attacked because arrogant people are evil.
In any case I think your solution might be correct. Originally I
was using interfaces and do recall it working with classes but
not interfaces but didn't know how to get it to work.