Optional type - how to correctly reset a wrapped immutable T
Nicholas Wilson
iamthewilsonator at hotmail.com
Mon Mar 26 09:46:57 UTC 2018
On Sunday, 25 March 2018 at 21:26:57 UTC, aliak wrote:
> Hi, I have this optional type I'm working on and I've run in to
> a little snag when it comes to wrapping an immutable. Basically
> what I want is for an Optional!(immutable T) to still be
> settable to "some" value or "no" value because the Optional
> wrapper itself is mutable.
>
> Optional!(immutable int) a = some(3);
> a = none;
>
> I used to do this via a dynamic array and opAssign would
> recreate the array
>
> struct Optional(T) {
> T[] bag;
> opAssign(T t) {
> bag = [t]
> }
> }
>
> But then there were problems with inout, namely:
>
> Error: variable `Optional!(inout(A)).Optional.bag` only
> parameters or stack based variables can be inout
>
> So I changed it to a stack variable (prefer this anyway, it's
> not only because of the inout error) but now I'm unsure if I'm
> violating the type system. Basically I'm now storing T as
> Unqual!T, but what I'm looking for is a Rebindable
> implementation that's for value types as well. Is this possible?
>
> Now I do this:
>
> struct Optional(T) {
> Unqual!T value;
> opAssign(T t) {
> value = cast(Unqual!T)(t);
> }
> }
>
> I put up a PR if anyone wants to see the code. Any pointers,
> tips would be highly appreciated:
>
> https://github.com/aliak00/optional/pull/13/files#diff-cb543fea6a0b5eeb07b6aac9f068e262
>
> Cheers
> - Ali
Have a look at Rebindable:
https://dlang.org/phobos/std_typecons.html#rebindable
More information about the Digitalmars-d-learn
mailing list