Oh!
http://d.hatena.ne.jp/satoru_h/20090629/p1
std.bitmanipを使う必要がないことに気づかされたので工夫してみた*1.
import std.stdio; import std.typecons; //import std.file; union UnionCast(T, U...) { T value; struct { U elems; } } void main() { uint[] buf = [0x000f,0x00ff,0x0fff];//cast(uint[])read("binary.dat"); { UnionCast!(Tuple!(uint,uint,uint), double, uint) c; c.value.field[0] = buf[0]; c.value.field[1] = buf[1]; c.value.field[2] = buf[2]; writeln(c.value); writeln(c.elems[0]); writeln(c.elems[1]); } { UnionCast!(Tuple!(uint,uint,uint), uint, double) c; c.value.field[0] = buf[0]; c.value.field[1] = buf[1]; c.value.field[2] = buf[2]; writeln(c.value); writeln(c.elems[0]); writeln(c.elems[1]); } } Tuple!(uint,uint,uint)(15, 255, 4095) 5.41109e-312 4095 Tuple!(uint,uint,uint)(15, 255, 4095) 15 2.0232e-320
何でもテンプレートにしてみたら何となくかっこよく見えるlifehack.
気にくわねぇな
c.valueに1つずつ代入しているところはどうにかならないのだろうか.
とりあえず
c.value = tuple(buf[0], buf[1], buf[2]);
こういうのがあることはわかった.
*1:ICFPCのためのコーディングの中で3つのuintから(double,uint)もしくは(uint,double)に分解する場面があった.