www.digitalmars.com         C & C++   DMDScript  

digitalmars.D - Should AliasThis allow implicit conversion to the subtype AliasThis

reply "Dylan Knutson" <tcdknutson gmail.com> writes:
I found out about AliasThis on the IRC, and it's pretty neat. 
I've got a suggestion for it however: Assigning a value to a 
class/struct which has aliased a member to this would forward the 
assignment to that member.

For instance:

----
struct IntPair {
	private int _pair;
	int left()  { return _pair[0]; }
	int right() { return _pair[1]; }
}

IntPair a = [1, 2]; // _pair = [1, 2]
IntPair b;
b.left(); //0
b = [3, 4];
b.left(); //3
----

Thoughts? I think it'd be very useful for defining types that 
look and act like built in primitives, but can have arbitrary 
methods and operator overloads attached to them.

Thanks to <jA_cOp> for bringing up AliasThis in IRC :-)
May 18 2013
next sibling parent reply "Dylan Knutson" <tcdknutson gmail.com> writes:
Oh this is embarrassing;
On Saturday, 18 May 2013 at 07:43:57 UTC, Dylan Knutson wrote:
 	private int _pair;
should be
       private int[2] _pair;
May 18 2013
parent "Dylan Knutson" <tcdknutson gmail.com> writes:
oh my; one more typo (I really wish these forums had edit 
functionality)

struct definition:

----
struct IntPair {
	private int[] _pair;
	int left()  { return _pair[0]; }
	int right() { return _pair[1]; }
	alias _pair this;
}
----
May 18 2013
prev sibling parent reply "Aleksandar Ruzicic" <krckoorascic gmail.com> writes:
On Saturday, 18 May 2013 at 07:43:57 UTC, Dylan Knutson wrote:
 I found out about AliasThis on the IRC, and it's pretty neat. 
 I've got a suggestion for it however: Assigning a value to a 
 class/struct which has aliased a member to this would forward 
 the assignment to that member.

 For instance:

 ----
 struct IntPair {
 	private int _pair;
 	int left()  { return _pair[0]; }
 	int right() { return _pair[1]; }
 }

 IntPair a = [1, 2]; // _pair = [1, 2]
 IntPair b;
 b.left(); //0
 b = [3, 4];
 b.left(); //3
 ----

 Thoughts? I think it'd be very useful for defining types that 
 look and act like built in primitives, but can have arbitrary 
 methods and operator overloads attached to them.

 Thanks to <jA_cOp> for bringing up AliasThis in IRC :-)
Just overload assignment operator for that. int[2] opBinary(string op)(int[2] rhs) if (op == "=") { _pair = rhs; return rhs; }
May 18 2013
parent "Aleksandar Ruzicic" <krckoorascic gmail.com> writes:
 int[2] opBinary(string op)(int[2] rhs) if (op == "=") {
 	_pair = rhs;
 	return rhs;
 }
Oops, that should be IntPair opAssign(int[2] rhs)
May 18 2013