www.digitalmars.com         C & C++   DMDScript  

digitalmars.D - True value semantics for class or struct?

reply "js.mdnq" <js_adddot+mdng gmail.com> writes:
Simple values are ones that act atomically and use the standard 
mathematical operations.

Suppose I would like to wrap an int with additional functionality:

struct SmartInt{
     privatedata
     int Value;
     methods
}

The idea is that SmartInt semantics are treated identical to 
SmartInt.Value

So SmartInt = 3; is identical to SmartInt.Value = 3;

But since it is a smart int we can do

SmartInt.SomeMethod()

Also, when a the struct is copied I might not want to copy 
privatedata as it might change the functionality(maybe instead of 
copying I want it to be set to 0, through a constructor, or 
method).

The main purpose though, is to treat SmartInt and SmartInt as one 
and the same semantically. As far as I'm concerned, SmartInt is 
an int... I just "wrapped" it up with some nice functions.

Is anything like this possible in D?
Nov 29 2012
parent =?UTF-8?B?QWxpIMOHZWhyZWxp?= <acehreli yahoo.com> writes:
On 11/29/2012 06:25 PM, js.mdnq wrote:
 Simple values are ones that act atomically and use the standard
 mathematical operations.

 Suppose I would like to wrap an int with additional functionality:

 struct SmartInt{
 privatedata
 int Value;
 methods
 }

 The idea is that SmartInt semantics are treated identical to SmartInt.Value

 So SmartInt = 3; is identical to SmartInt.Value = 3;

 But since it is a smart int we can do

 SmartInt.SomeMethod()

 Also, when a the struct is copied I might not want to copy privatedata
 as it might change the functionality(maybe instead of copying I want it
 to be set to 0, through a constructor, or method).

 The main purpose though, is to treat SmartInt and SmartInt as one and
 the same semantically. As far as I'm concerned, SmartInt is an int... I
 just "wrapped" it up with some nice functions.

 Is anything like this possible in D?

There is 'alias this': struct SmartInt{ int Value; double privatedata; void someMethod() {} alias Value this; /* Note: A more intuitive syntax is coming with dmd 2.061: * * alias this = Value; * * (I hope I remembered it correctly. :p) */ } void main() { auto s = SmartInt(42); s = 45; int result = s + 43; s.someMethod(); } Ali
Nov 29 2012