www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - Converting member variables to strings with using reflection from base

reply kerdemdemir <kerdemdemir gmail.com> writes:
I want to make a logging function for member variables by using 
reflection.

import std.stdio;

class D : B
{
     override void foo() {
         a  = 4.0;
         b  = 3.0;
     }
     double a;
     double b;
}

class B
{
     void Log()
     {
         auto a = [__traits(derivedMembers, D)];
         foreach(memberName; a) {
             // Somehow write only member variables with their 
names
             // Result should be : a = 4.0, b = 3.0
         }
     }

     void foo()
     {
     }
}

void main()
{
      auto b = new D;
      b.Log();
}

As I wrote in the comments I want to see member variable's name 
and its value.
What is the best way to achieve that?

Erdem
Dec 22 2017
parent reply "H. S. Teoh" <hsteoh quickfur.ath.cx> writes:
On Fri, Dec 22, 2017 at 09:13:31PM +0000, kerdemdemir via Digitalmars-d-learn
wrote:
 I want to make a logging function for member variables by using reflection.
[...]
 class B
 {
     void Log()
     {
         auto a = [__traits(derivedMembers, D)];
         foreach(memberName; a) {
             // Somehow write only member variables with their names
             // Result should be : a = 4.0, b = 3.0
Try this: import std.traits : FieldNameTuple; foreach (memberName; FieldNameTuple!B) { writefln("%s = %s", memberName, mixin("this." ~ memberName)); } T -- People walk. Computers run.
Dec 22 2017
parent Mengu <mengukagan gmail.com> writes:
On Friday, 22 December 2017 at 22:09:05 UTC, H. S. Teoh wrote:
 On Fri, Dec 22, 2017 at 09:13:31PM +0000, kerdemdemir via 
 Digitalmars-d-learn wrote:
 I want to make a logging function for member variables by 
 using reflection.
[...]
 class B
 {
     void Log()
     {
         auto a = [__traits(derivedMembers, D)];
         foreach(memberName; a) {
             // Somehow write only member variables with their 
 names
             // Result should be : a = 4.0, b = 3.0
Try this: import std.traits : FieldNameTuple; foreach (memberName; FieldNameTuple!B) { writefln("%s = %s", memberName, mixin("this." ~ memberName)); } T
and then turn it into a LoggerMixin with a mixin template and re-use it any time you want. import std.stdio : writeln, writefln; import std.traits : FieldNameTuple; mixin template LoggerMixin() { void Log() { foreach (memberName; FieldNameTuple!(typeof(this))) { writefln("%s = %s", memberName, mixin("this." ~ memberName)); } } } struct S { int x; bool y; double z; mixin LoggerMixin; } void main() { S s1 = S(int.min, true, 6666); S s2 = S(int.max, false, 6666); s1.Log(); s2.Log(); }
Dec 22 2017