Thread overview | |||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
|
April 09, 2011 Anyone have a function to print out the field name and its value? | ||||
---|---|---|---|---|
| ||||
Let's say I have this structure: struct PAINTSTRUCT { bool state; } And somewhere in my main code I want to print out the value of state. But I also want to know what I'm printing out. So usually I'd do this: void main() { PAINTSTRUCT ps; writefln("ps.state = %s", ps.state); } Has anyone written a function which will automatically print out both the variable name and any object it might be part of, and then the value? E.g. I'd like to use a function like this: writeField(ps.state); And if state is false it would print out to the console: "ps.state = false" I can't really touch PRINTSTRUCT because it's already defined as a WinAPI structure and messing with that would be bad, so I can't implement toString() or any helper functions within the struct. I need an outside function which could do this automatically for any object/struct type. |
April 09, 2011 Re: Anyone have a function to print out the field name and its value? | ||||
---|---|---|---|---|
| ||||
Posted in reply to Andrej Mitrovic | Andrej Mitrovic Wrote:
>
Actually I couldn't really just use "ps.fErase", because that just passes a bool to the function. Hmm.. this doesn't look possible to do without introducing complexity at the calling site.
|
April 09, 2011 Re: Anyone have a function to print out the field name and its value? | ||||
---|---|---|---|---|
| ||||
Posted in reply to Andrej Mitrovic | On 09/04/2011 18:13, Andrej Mitrovic wrote: > Let's say I have this structure: > > struct PAINTSTRUCT > { > bool state; > } > > And somewhere in my main code I want to print out the value of state. But I also want to know what I'm printing out. So usually I'd do this: > void main() > { > PAINTSTRUCT ps; > writefln("ps.state = %s", ps.state); > } > > Has anyone written a function which will automatically print out both the variable name and any object it might be part of, and then the value? > > E.g. I'd like to use a function like this: > writeField(ps.state); > > And if state is false it would print out to the console: > "ps.state = false" > > I can't really touch PRINTSTRUCT because it's already defined as a WinAPI structure and messing with that would be bad, so I can't implement toString() or any helper functions within the struct. I need an outside function which could do this automatically for any object/struct type. Off the top of my head (untested): ---- void print(T)(T t) if (is(T == struct) || is(T == class)) { foreach (i, field; t.tupleof) { writefln(T.tupleof[i].stringof ~ " = %s", field); } } ---- -- Robert http://octarineparrot.com/ |
April 09, 2011 Re: Anyone have a function to print out the field name and its value? | ||||
---|---|---|---|---|
| ||||
Posted in reply to Robert Clipsham | On 09/04/2011 18:23, Robert Clipsham wrote: > Off the top of my head (untested): > ---- > void print(T)(T t) if (is(T == struct) || is(T == class)) > { > foreach (i, field; t.tupleof) > { > writefln(T.tupleof[i].stringof ~ " = %s", field); > } > } > ---- > > -- > Robert > http://octarineparrot.com/ I forgot to mention... Usage: --- print(myStruct); ---- It's also simple enough to adapt to just print a given field etc. -- Robert http://octarineparrot.com/ |
April 09, 2011 Re: Anyone have a function to print out the field name and its value? | ||||
---|---|---|---|---|
| ||||
Posted in reply to Andrej Mitrovic | Wow, I figured out a trick. Check it out, two modules: 1. fieldwrite.d: module fieldwrite; import std.string; import std.stdio; import std.conv; mixin template field(string T) { struct FieldTemp { this(string str) { writefln(str ~ " = %s", mixin(T)); } } FieldTemp fieldTemp = FieldTemp(T); } 2. driver.d: import std.stdio; import fieldwrite; struct S { int x; int y; } void main() { S s; s.x = 1; s.y = 2; mixin field!"s.x"; mixin field!"s.y"; } |
April 09, 2011 Re: Anyone have a function to print out the field name and its value? | ||||
---|---|---|---|---|
| ||||
Posted in reply to Robert Clipsham | On 4/9/11, Robert Clipsham <robert@octarineparrot.com> wrote:
> On 09/04/2011 18:23, Robert Clipsham wrote:
>> Off the top of my head (untested):
>> ----
>> void print(T)(T t) if (is(T == struct) || is(T == class))
>> {
>> foreach (i, field; t.tupleof)
>> {
>> writefln(T.tupleof[i].stringof ~ " = %s", field);
>> }
>> }
>> ----
>>
>> --
>> Robert
>> http://octarineparrot.com/
>
> I forgot to mention... Usage:
> ---
> print(myStruct);
> ----
>
> It's also simple enough to adapt to just print a given field etc.
>
> --
> Robert
> http://octarineparrot.com/
>
That's great, I can use it to print out all the fields. Thanks!
|
April 09, 2011 Re: Anyone have a function to print out the field name and its value? | ||||
---|---|---|---|---|
| ||||
On 4/9/11, Andrej Mitrovic <andrej.mitrovich@gmail.com> wrote: > That's great, I can use it to print out all the fields. Thanks! Some error checking should be done, or maybe there's a bug. If a field has a type that is a typedef to say a void*: typedef void* HANDLE struct S { HANDLE hnd; } Printing hnd will fail with an error: D:\DMD\dmd2\windows\bin\..\..\src\phobos\std\format.d(1599): Error: function std.format.formatValue!(LockingTextWriter,HANDLE,immutable(char)).formatValue is deprecated D:\DMD\dmd2\windows\bin\..\..\src\phobos\std\format.d(308): Error: template instance std.format.formatGeneric!(LockingTextWriter,HANDLE,immutable(char)) error instantiating D:\DMD\dmd2\windows\bin\..\..\src\phobos\std\stdio.d(701): instantiated from here: formattedWrite!(LockingTextWriter,immutable(char),HANDLE) D:\DMD\dmd2\windows\bin\..\..\src\phobos\std\stdio.d(1598): instantiated from here: writefln!(string,HANDLE) hello_msg.d(35): instantiated from here: writefln!(string,HANDLE) hello_msg.d(129): instantiated from here: print!(PAINTSTRUCT) Btw, why are we not allowed to have mixin templates that have statements? Why only declarations? |
April 09, 2011 Re: Anyone have a function to print out the field name and its value? | ||||
---|---|---|---|---|
| ||||
Posted in reply to Andrej Mitrovic | On 09/04/2011 18:44, Andrej Mitrovic wrote: > On 4/9/11, Andrej Mitrovic<andrej.mitrovich@gmail.com> wrote: >> That's great, I can use it to print out all the fields. Thanks! > > Some error checking should be done, or maybe there's a bug. If a field > has a type that is a typedef to say a void*: > typedef void* HANDLE > > struct S > { > HANDLE hnd; > } > > Printing hnd will fail with an error: > > D:\DMD\dmd2\windows\bin\..\..\src\phobos\std\format.d(1599): Error: > function std.format.formatValue!(LockingTextWriter,HANDLE,immutable(char)).formatValue > is deprecated > D:\DMD\dmd2\windows\bin\..\..\src\phobos\std\format.d(308): Error: > template instance > std.format.formatGeneric!(LockingTextWriter,HANDLE,immutable(char)) > error instantiating > D:\DMD\dmd2\windows\bin\..\..\src\phobos\std\stdio.d(701): > instantiated from here: > formattedWrite!(LockingTextWriter,immutable(char),HANDLE) > D:\DMD\dmd2\windows\bin\..\..\src\phobos\std\stdio.d(1598): instantiated > from here: writefln!(string,HANDLE) > hello_msg.d(35): instantiated from here: writefln!(string,HANDLE) > hello_msg.d(129): instantiated from here: print!(PAINTSTRUCT) For now you can compile with -d, this should be reported as a bug though. > Btw, why are we not allowed to have mixin templates that have > statements? Why only declarations? Dunno, never made sense to me... Could be a question for d.D. -- Robert http://octarineparrot.com/ |
April 09, 2011 Re: Anyone have a function to print out the field name and its value? | ||||
---|---|---|---|---|
| ||||
Posted in reply to Robert Clipsham | On 4/9/11, Robert Clipsham <robert@octarineparrot.com> wrote: > For now you can compile with -d, this should be reported as a bug though. Ok, reported. http://d.puremagic.com/issues/show_bug.cgi?id=5825 > Dunno, never made sense to me... Could be a question for d.D. Yup. :) |
Copyright © 1999-2021 by the D Language Foundation