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.

Reply via email to