NoCopy for overriding @disable this(this)
Shachar Shemesh
shachar at weka.io
Thu Apr 12 12:16:53 UTC 2018
I'm trying to build a wrapper that will allow you to copy structs that
have members that disabled copying. The idea is that copying these
members will revert them to init.
This is what I have so far:
struct NoCopy(T) {
static assert( !hasElaborateDestructor!T, "NoCopy does not support
type " ~ T.stringof ~ " with elaborate destructor" );
private:
ubyte[T.sizeof] __bytes;
public:
this(T val) {
__bytes[] = (cast(const ubyte *)&val)[0..T.sizeof][];
}
@property ref inout(T) value() inout nothrow @trusted @nogc {
return *cast(inout T*)__bytes.ptr;
}
this(this) {
value = T.init;
}
void opAssign(NoCopy rhs) {
value = T.init;
}
void opAssign(T rhs) {
value = move(rhs);
}
alias this value;
}
I'm having problems with setting the initial value for the byte array.
The technique I use in "value" does not work for initialization:
test.d(19): Error: cannot convert &S to const(ubyte*) at compile time
At first, I said "fine, the user will do it". That doesn't work,
however. It doesn't matter who tries to do it, I cannot get the byte
value of the type at compile time.
I tried using a union, but that, too, doesn't work.
I understand why the restriction is in place. What I'm wondering is
whether there is any other solution, either to the init problem or to
the overriding disable problem.
Thank you,
Shachar
More information about the Digitalmars-d
mailing list