Bypassing const with a union
Ali Çehreli
acehreli at yahoo.com
Fri Jun 1 14:15:16 PDT 2012
On 06/01/2012 01:24 PM, Era Scarecrow wrote:
> Good, but if I wanted to return an const item (as above) we have an
> issue. Since I want to change the pointer (but not it's contents) as a
> slice, the const system gets in the way without duping it.
>
> //from const, to const
> const(S) opSlice(int s, int e) const {
> S s = this; //compile error this.array is const
> s.array = this[s .. e]; //compile error
> return s;
> }
Don't forget inout, which seems to be working at least in this case:
import std.traits;
import std.stdio;
struct S {
size_t[] array;
void length(size_t length) @property
{
array.length = length;
}
inout(S) copy() inout {
return this;
}
inout(S) opSlice(int s, int e) inout {
Unqual!S sl;
sl.array = (cast(Unqual!S)this).array[s .. e];
return cast(inout(S))sl;
}
}
void main()
{
auto s = S();
s.length = 10;
const s3 = s[0..8];
const s4 = s3[1..3];
auto sc = s.copy();
auto s3c = s3.copy();
}
std.traits.Unqual seems like a dirty trick there but I see it being used
in Phobos as well.
> struct S {
> union {
> size_t[] array;
> size_t[array.sizeof / size_t.sizeof] nonConst; //since it's a fixed array
> }
I don't understand the calculation there. array.sizeof and size_t.sizeof
are not related in that way. It works only if 'array' is fixed-length as
well.
Ali
--
D Programming Language Tutorial: http://ddili.org/ders/d.en/index.html
More information about the Digitalmars-d-learn
mailing list