Getting all struct members and values with introspection avoiding string mixins

ParticlePeter via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Sun May 1 03:40:15 PDT 2016


On Sunday, 1 May 2016 at 10:13:47 UTC, H. S. Teoh wrote:
> On Sun, May 01, 2016 at 09:42:37AM +0000, ParticlePeter via 
> Digitalmars-d-learn wrote:
>> I am logging arbitrary POD struct types with member names and 
>> data:
>> 
>> void printStructInfo( T )( T info ) {
>>   foreach( i, A; typeof( T.tupleof )) {
>>     enum attribName = T.tupleof[i].stringof;
>>     writefln( "%s : %s", attribName, mixin( "info." ~ 
>> attribName ));
>>   }
>> }
>> 
>> Is there is some other way to evaluate info.attribName without 
>> using string mixins?
> [...]
>
> Using typeof(T.tupleof) seems a bit circuitous. Here's how I'd 
> do it:
>
> 	void printStructInfo( T )( T info ) {
> 		import std.stdio : writefln;
> 		foreach (memb; __traits(allMembers, T)) {
> 			writefln("%s: %s", memb,
> 				__traits(getMember, info, memb));
> 		}
> 	}
>
> (For structs that have members other than data fields, you'll 
> need a static if to filter out non-value members, but this 
> should get you started.)
>
>
> T

Thanks, I was searching for that!
The given example is a simplification of my code. I do examine 
each member separately and treat accordingly, but eventually used 
the mixin version to get the build-in type values.



More information about the Digitalmars-d-learn mailing list