Thread overview | ||||||
---|---|---|---|---|---|---|
|
May 19, 2017 "if" is not evaluated for fields of Class.tupleof | ||||
---|---|---|---|---|
| ||||
Hey there, trying to read data into the fields of a class. This is what I got so far: ``` import std.traits; import std.bitmanip; class Test { byte[4] marray; byte mbyte; this(ubyte[] data) { auto fields = this.tupleof; foreach (field; fields) { // Here it should actually not enter when field is mbyte (byte) if (isStaticArray!(typeof(field))) { for (int i = 0; i < field.length; i++) field[i] = data.read!(typeof(field[i])); } else { } } } } void main() { new Test([0x12, 0x23, 0x34, 0x45, 0x56]); } ``` The problem is that `isStaticArray` won't halt when the field is `byte`. When I add a `writeln(isStaticArray!(typeof(field)));` it will write `false` for `mbyte` though... What's the problem? Is it a bug? And: Is there a better way to do what I'm trying to do?... |
May 19, 2017 Re: "if" is not evaluated for fields of Class.tupleof | ||||
---|---|---|---|---|
| ||||
Posted in reply to Timoses | On 05/19/2017 03:46 PM, Timoses wrote:
> foreach (field; fields)
> {
> // Here it should actually not enter when field is mbyte (byte)
> if (isStaticArray!(typeof(field)))
You probably want `static if` here.
With normal `if`, the body still gets compiled, even if the condition is compile-time constant false. With `static if`, the body is skipped.
|
May 23, 2017 Re: "if" is not evaluated for fields of Class.tupleof | ||||
---|---|---|---|---|
| ||||
Posted in reply to ag0aep6g | The easiest way is probably casting: ``` import std.traits; import std.bitmanip; class Test { byte[4] marray; byte mbyte; } void main() { auto value = [0x12, 0x23, 0x34, 0x45, 0x56]; auto test = cast(Test*) value.ptr; } ``` |
May 23, 2017 Re: "if" is not evaluated for fields of Class.tupleof | ||||
---|---|---|---|---|
| ||||
Posted in reply to Timoses | On Tuesday, 23 May 2017 at 06:42:55 UTC, Timoses wrote:
> The easiest way is probably casting:
>
> ```
> import std.traits;
> import std.bitmanip;
>
> class Test {
> byte[4] marray;
> byte mbyte;
> }
>
> void main() {
> auto value = [0x12, 0x23, 0x34, 0x45, 0x56];
> auto test = cast(Test*) value.ptr;
> }
> ```
Don't cast arbitrary types to classes, you're going to stumble upon very nasty surprises :) I guess you meant struct?
Classes in D are quite fat, and don't start with data members right away, bookkeeping ClassInfo data comes first.
|
Copyright © 1999-2021 by the D Language Foundation