Possible @property compromise

Zach the Mystic reachBUTMINUSTHISzach at gOOGLYmail.com
Sat Feb 2 09:25:54 PST 2013


On Saturday, 2 February 2013 at 06:04:01 UTC, TommiT wrote:
> On Saturday, 2 February 2013 at 03:50:49 UTC, Zach the Mystic 
> wrote:
>> assert(A.B.C.myMemberFunction(a, a.b, a.b.c) == 3);
>
> That wouldn't compile, so you must mean:
>
> assert(a.b.c.myMemberFunction(a, a.b, a.b.c) == 3);

You're right. I don't know how the compiler stores the name of 
the function I meant underneath the hood. But it must such a 
mechanism for naming A.B.C.myMemberFunction, which is nothing  
more than a function which takes a pointer, or in this case a few 
pointers, to instances of the appropriate classes. Non-static 
member functions generally must take pointers to instances of 
their types. The only difference between this:

struct A
{
   int _a;
   int getA() { return _a; }
}

And this:

struct A
{
   int _a;
}
int getA(ref A a) { return a._a; }

Is that the compiler does the work of including the hidden 
pointer automatically in the first case, and also encloses getA 
into a, I hesitate to say it too loud now... namespace, so that 
it can't just be reached from anywhere.

>
> What do you suppose would happen if I wrote the following?
>
> struct A
> {
>   int _a = 1;
>   B b;
>   struct B
>   {
>     int _b = 1;
>     C c;
>     struct C
>     {
>       int _c = 1;
>       int myMemberFunction() { return _a + _b + _c; }
>     }
>     static int otherFunction()
>     {
>       C cc;
>       return cc.myMemberFunction();
>     }
>   }
> }
>
> void main()
> {
>   int i = A.B.otherFunction();
> }

I was simply using A.B.C.myMemberFunction as a shorthand for 
whatever name the compiler uses underneath the hood to represent 
the non-static version of the function.


More information about the Digitalmars-d mailing list