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.

Reply via email to