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