Match properties as member variables

Jakob Ovrum jakobovrum at gmail.com
Sun Dec 15 15:13:37 PST 2013


On Friday, 13 December 2013 at 12:01:28 UTC, comco wrote:
> From client perspective, properties look like member variables.
> With (auto) ref, a generic function can catch a member variable 
> and read it and update it:
>
> void swap(T)(ref T a, ref T b) {...}
>
> The client can use swap with member variables.
> But he can't use this swap with class properties - they're 
> special.
>
> Since the properties "look like" member variables, I think it 
> is a valid use-case for us to want to be able to write generic 
> code that can handle properties passed as arguments in the same 
> way as member variables passed as arguments.
>
> Can you write version of swap, which works also with properties 
> and/or combination of properties and references?

The issue is that reference parameters expect lvalue arguments, 
while property functions that return by value result in rvalues. 
It's the same reason you can't do `swap(1, 2)` - the literals `1` 
and `2` are rvalues.

You can make your property getters result in lvalues by returning 
by reference. The syntax mirrors that of reference parameters:

---
struct S
{
     private int _i;

     ref int i() @property
     {
         return _i;
     }
}

void main()
{
     S s1, s2;

     s1.i = 1;
     s2.i = 2;

     import std.algorithm : swap;
     swap(s1.i, s2.i);

     assert(s1.i == 2);
     assert(s2.i == 1);
}
---


More information about the Digitalmars-d-learn mailing list