How about this?: private template Eqsize(T) { static if (T.sizeof == 4) { alias uint S; } else static if (T.sizeof == 8) { alias ulong S; } }
private union IntFloat { uint _int; float _float; } private union IntDouble { ulong _long; double _double; } T byteSwap(T)(T val) if (isIntegral!T || isSomeChar!T) { static if (T.sizeof == 2) { return cast(T) ((cast(ushort) val >> 8) | (cast(ushort) val << 8)); } else static if (T.sizeof == 4) { return cast(T) bswap(cast(uint) val); } else static if (T.sizeof == 8) { return cast(T)bswap(cast(uint) (val >> 32)) | (cast(T)bswap(cast(uint) val) << 32); } } Eqsize!(T).S byteSwap(T)(T val) if (isFloatingPoint!T) { static if (T.sizeof == 4) { IntFloat _if; _if._float = val; _if._int = bswap(_if._int); return _if._int; } else static if (T.sizeof == 8) { IntDouble id; id._double = val; id._long = byteSwap(id._long); return id._long; } } unittest { float a = 45.17249; IntFloat _if; _if._int = byteSwap(byteSwap(a)); assert(a is _if._float); assert(a == _if._float); double b = 835.48502; IntDouble id; id._long = cast(ulong) byteSwap(byteSwap(b)); assert(b is id._double); assert(b == id._double); long c = 0x0102040880402010; long d = 0x1020408008040201; assert(byteSwap(c) == d); assert(byteSwap(c) is d); assert(byteSwap(byteSwap(c)) == c); assert(byteSwap(byteSwap(c)) is c); assert(byteSwap(cast(short) -45) == -11265); assert(byteSwap(cast(short) -45) is -11265); assert(byteSwap(0x18244281) == 0x81422418); assert(byteSwap(0x18244281) is 0x81422418); } T bigEndianToNative(T)(T val) if (isNumeric!T || isSomeChar!T) { static if (endian == Endian.BigEndian) { return val; } else { return byteSwap(val); } } alias bigEndianToNative nativeToBigEndian; T littleEndianToNative(T)(T val) if (isNumeric!T || isSomeChar!T) { static if (endian == Endian.LittleEndian) { return val; } else { return byteSwap(val); } } alias littleEndianToNative nativeToLittleEndian;