smart pointer for interior pointers
Steven Schveighoffer via Digitalmars-d
digitalmars-d at puremagic.com
Thu May 28 06:18:48 PDT 2015
On 5/27/15 6:21 PM, Artur Skawina via Digitalmars-d wrote:
>> But with alias this, we can define a way to solve all these problems.
>>
>> struct SPtr(T)
>> {
>> ptrdiff_t _offset;
>> void opAssign(T *orig) { _offset = cast(void *)orig - cast(void *)&this;}
>> inout(T) *_get() inout { return cast(inout(T)*)((cast(inout(void) *)&this) + _offset);}
>> alias _get this;
>> }
>>
>> Basically, instead of storing the pointer, we store the offset to the struct itself. This works as long as the SPtr instance stays co-located with its target.
>
> auto a = s.y;
> // this 'a' now implicitly converts to 'int', but...
>
> void g(T)(T a);
> g(s.y); // ditto.
>
Yes, both your cases (including the one that I didn't quote) show that
such constructs must be controlled privately. For example, S should
really be written like this:
struct S
{
int x;
private SPtr!int _y;
int *y() {return _y;}
void y(int * newy) { _y = newy; }
}
And it gets kind of sticky from there if you wanted to replace an actual
variable :) For example, y++.
But you can get most of the abilities of a member and still not destroy
the semantic of having it reference the copy.
I actually need this in the project I'm writing, which I'm hoping to get
into Phobos, and I'm either going to define it in that project, or
define it in std.typecons. Maybe the best thing to do is to define it
privately for that module, and then move it somewhere more public if it
turns out to be something that's useful elsewhere.
-Steve
More information about the Digitalmars-d
mailing list