question about using std.bitmanip.read

BBaz via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Fri Nov 6 19:50:05 PST 2015


On Saturday, 7 November 2015 at 03:19:44 UTC, Charles wrote:
> Hi guys,
>
> It's me again... still having some issues pop up getting 
> started, but I remain hopeful I'll stop needing to ask so many 
> questions soon.
>
> I'm trying to use std.bitmanip.read; however, am having some 
> issues using it. For basic testing I'm just trying to use:
>
>     read!double(endianess, ubyteArr).writeln;
>
> endianess is an Endian from std.system, and ubyteArr is an 8 
> byte ubyte[].
>
> When I run this I get:
>
> Error: template std.bitmanip.read cannot deduce function from 
> argument types !(double)(Endian, ubyte[]), candidates are:
>     std.bitmanip.read(T, Endian endianness = Endian.bigEndian, 
> R)(ref R range) if (canSwapEndianness!T && isInputRange!R && 
> is(ElementType!R : const(ubyte)))
> dmd failed with exit code 1.
>
>
> Clearly that didn't work, so I tried excluding the endianess:
>
>     read!double(ubyteArr).writeln;
>
> and that does work! But its the wrong byte order, so its 
> incorrect anyways.
>
> I went to std.bitmanip to look for unittests using the Endian, 
> and the only one that does uses read!(T, endianness), which 
> needs endianness to be known at compile time, which I don't 
> have.
>
> Any suggestions?

You must create a classic run-time branch:

---
if(endianess == Endian.bigEndian)
    read!(Endian.bigEndian, double)(ubyteArr).writeln;
else
    read!(Endian.littleEndian, double)(ubyteArr).writeln;
---

or in the same fashion use a final switch.


More information about the Digitalmars-d-learn mailing list