Andrei Alexandrescu wrote:
Michiel Helvensteijn wrote:
Andrei Alexandrescu wrote:
void move(ref T src, ref T dst);
void swap(ref T lhs, ref T rhs);
...
But if "prop" is a property with get and set, everything falls apart.
Properties effectively hide the address of the actual data and only
traffic in values. That's often good (and sometimes even the only
possibility in the case of properties computed on-the-fly), but this
abstraction effectively makes resource-conserving move and swap
impossible.
...
What to do? I'd like to refine the notion of property such that moving
properties around is possible, without, however, complicating their
interface too much.
I posted a possible solution to this (I think) in the last properties
thread. I was thinking that properties might be equiped with extra member
functions. One advantage is that you might get more efficiency. I
think you
just named another.
class Host
{
property prop
{
T get() { ... }
void set(T value) { ... }
void move(ref T dst) { ... }
void swap(ref T rhs) { ... }
}
}
But these are too many. These should suffice:
class Host
{
property prop
{
T get();
void acquire(ref T value) { ... }
void release(ref T value) { ... }
}
}
set() can be implemented as acquire from a copy, and swap can be
implemented by calls to acquire and release. Technically, get() could be
also implemented with acquire and release, but that's too intensive for
most types.
The problem I'm seeing is that most people won't want to go through the
trouble of implementing three functions for one property.
Andrei
What about this:
class Host
{
property acquire release prop
{
T get();
}
}
And then the compiler will automatically created the "acquire" and
"release" methods.
There could also be what I would like to call "property shortcuts" (ruby
calls this attributes) like this:
class Host
{
get acquire release T prop;
get set T prop2;
}