digitalmars.D.learn - how to have alias this with an unaccessible member?
- Timothee Cour (15/15) May 17 2013 How to have alias this with an unaccessible member (x below).
- Dicebot (12/12) May 18 2013 Will this do?
- Dicebot (11/11) May 18 2013 Btw, fun fact. This code crashes 2.063 beta:
- Timothee Cour (28/40) May 23 2013 This won't do for the same reason: now 'get' is made public so we're bac...
How to have alias this with an unaccessible member (x below). Making the member private won't work as it'll disable all operations on said member. ---- struct A(T){ T x; //private T x would prevent alias this from doing anything useful alias x this; } void main(){ auto a=A!int; a++;//should do a.x++; static assert(!__traits(compiles,a.x)); // I want this to hold } ----
May 17 2013
Will this do? -------------------- struct A(T) { private T x; ref T get() { return x; } alias get this; } ---------------------
May 18 2013
Btw, fun fact. This code crashes 2.063 beta: ------------------------ struct A(T) { private T x; alias y = x; alias y this; } ------------------------ dmd: aliasthis.c:114: virtual void AliasThis::semantic(Scope*): Assertion `t' failed.
May 18 2013
This won't do for the same reason: now 'get' is made public so we're back to the same problem (inverting roles of x and get). However what about changing the behavior of alias this as follows: when a member/method x is private, "alias x this" behaves as if x was not declared private. I think this makes sense: * this allows protection (x is an implementation detail) so that 'this' behaves exactly as 'x' * also, without this change of behavior, "alias x this" would not make any sense in terms of behavior outside the class (inside behavior should just access x directly) Then, when multiple alias this statements will become allowed in D, we would have implemented the same concept as "embedding" in GO. Any thoughts? here's what we would have: ---- struct A(T){ private T x would prevent alias this from doing anything useful alias x this; } void main(){ auto a=A!int; a++;//should do a.x++; //semantic change: even though x is private, all its methods are un-privated through alias this. static assert(!__traits(compiles,a.x)); } ---- On Sat, May 18, 2013 at 1:33 AM, Dicebot <m.strashun gmail.com> wrote:Will this do? -------------------- struct A(T) { private T x; ref T get() { return x; } alias get this; } ---------------------
May 23 2013