dmd casts but ldc doesn't, and doesn't work in template in dmdm

H. S. Teoh via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Sun Jun 4 18:17:02 PDT 2017


On Sun, Jun 04, 2017 at 06:12:42PM -0700, H. S. Teoh wrote:
> On Mon, Jun 05, 2017 at 01:14:31AM +0000, Mike B Johnson via Digitalmars-d-learn wrote:
> [...]
> > Guid is a struct and I am trying to get the "bytes" of the struct" to
> > get the guid bytes. It is quicker than accessing all the elements one
> > at a time.
> 
> 	union U {
> 		typeof(guid) guid;
> 		ubyte[guid.sizeof] bytes;
> 	}
> 	U u;
> 	u.guid = guid;
> 	// ... do something with u.bytes.
[...]

And if you're going to be doing this a lot on many different types, you
could ease the typing by declaring a template for it, for example:

	union AsBytes(T) {
		T t;
		ubyte[T.sizeof] bytes;
	}
	ubyte[T.sizeof] asBytes(T)(T t) {
		AsBytes!T u;
		u.t = t;
		return u.bytes;
	}
	...
	struct S {
		/* stuff */
	}

	S s;
	auto bytes = s.asBytes;
	... /* do stuff with bytes, which is a static array of ubyte */

Note, of course, that this will be @system if T contains any pointers.


T

-- 
2+2=4. 2*2=4. 2^2=4. Therefore, +, *, and ^ are the same operation.


More information about the Digitalmars-d-learn mailing list