Use template functions within mixin
Timoses via Digitalmars-d-learn
digitalmars-d-learn at puremagic.com
Wed Jun 7 06:42:42 PDT 2017
On Tuesday, 6 June 2017 at 18:08:52 UTC, Ali Çehreli wrote:
> Just import modules at local scopes. Here is something that
> works:
>
> void displayinfo(T)(T v) {
> import std.stdio : writefln;
> writefln("%08x", v);
> }
>
> void foo() {
> import std.meta : AliasSeq;
>
> enum value = cast(ubyte[])x"33 3a 3f d4";
> foreach (type; AliasSeq!(int, uint, byte)) {
> static if (value.length == type.sizeof) {
> import std.bitmanip : littleEndianToNative;
>
> pragma(msg, "working with " ~ type.stringof);
>
> ubyte[type.sizeof] raw = value;
> auto fValue = raw.littleEndianToNative!type;
> displayinfo(fValue);
> break;
> }
> }
> }
>
> void main() {
> foo();
> }
>
> Ali
Sorry, it was probably a bad example.
The value ubyte[] array read at run-time.
The way of Patrick Schluter works!
```
void displayinfo(T)(T ff) {
writeln(ff);
}
switch (varType)
{
import std.meta;
foreach (type; AliasSeq!("int", "uint", "byte"))
{
pragma(msg, type);
mixin(`case `~type~`.stringof:
if (value.length == `~type~`.sizeof)
{
ubyte[`~type~`.sizeof] raw =
value[0..$];
auto fValue =
raw.littleEndianToNative!(`~type~`);
displayinfo(fValue);
}
break;`);
}
```
I'm trying to detect whether the type is `uint`, but the
following does not seem to work:
```
static if (is (type == uint))
{
pragma(msg, "isi uint");
assert(0);
}
```
The reason is that I'd like to have the cases:
- `case "uint":`
- `case "unsigned int":`
for the uint loop turn.
More information about the Digitalmars-d-learn
mailing list