04.08.2010 14:11, Rory Mcguire wrote:
Hi,

The code below is my beginning to attempt a class which implements any class
and throws an exception if one tries to access any member of that class.

Problem is that if I use:
auto a1 = noinit!(A)();

it works and accesses the int x() {...} member of the generated class, but
if I use:
A a1 = noinit!(A)();

it accesses A.x instead of the generated classes x.

So am I wrong in making a sub class have a member function which hides a
parent class's member variable or is the compiler wrong and it should
generate a call to generated sub class?


Thanks!!!
-Rory











================================================
import std.algorithm;
import std.contracts;
import std.traits;

class A {
        int x;
}

string thrower(T)(string name) {
        static if (isNumeric!T) {
                return "@property ref "~ T.stringof ~" "~ name ~"() {
throw new Exception(\"Uninitialized access!\"); }"
                                "@property ref "~ T.stringof ~"
"~ name ~"(int ignored) { throw new Exception(\"Uninitialized access\"); }";
        } else {
                return "error";
        }
}
string build(alias T, alias generator)(string myname) {
        string s = "auto "~ myname ~" = new class "~T.stringof~" {
invariant() { throw new Exception(\"inv\");}\n";
        foreach (i,t; typeof(T.tupleof)) {
                string name = find(T.tupleof[i].stringof, '.');
                enforce(name.length>= 2);
                name = name[1..$];
                //pragma(msg, t," ", A.tupleof[i]);
                s ~= "\t"~generator!t(name) ~"\n";
        }
        return s~ "};";
}

auto noinit(alias T)() {
        mixin(build!(T,thrower)("tmp"));
        return tmp;
}


void main() {
        A a = noinit!(A)();
        auto a1 = noinit!(A)();
//      pragma(msg, build!(A,thrower)("Athrower"));
        
        int i = a.x = 3; // uses A.x not the generated ??.x
        int j = a1.x = 3; // uses ??.x
        assert(a.x == 3);
}

=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
Filtered-With-Copfilter: Version 0.84beta4 (ProxSMTP 1.8)
Copfilter-Filtered-With: SpamAssassin 3.2.5
Copfilter-Virus-Scanned: ClamAV 0.94.2
by Markus Madlener @ http://www.copfilter.org

Hi,

You're working with 'a' through 'class A' public interface, because you plainly declared 'a' to be of 'class A'. A.x is not a function, but a member variable, so the compiler fairly accesses it as it should.

Regards,
Stanislav Blinov

Reply via email to