www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - Metaprogramming with traits

reply Ram_B <zvolkzrus gmail.com> writes:
How i can get fields of derived classes in runtime? This not works

import std.traits;
import std.experimental.logger;


class A {
	int a,b;
	this(){}
	void fields(){
		log(FieldNameTuple!this);	
	}
}

class B : A{
	int c;
	this(){}
}

void main(){
	B b = new B();
	b.fields();
}
Sep 15 2016
next sibling parent rikki cattermole <rikki cattermole.co.nz> writes:
On 16/09/2016 3:07 AM, Ram_B wrote:
 How i can get fields of derived classes in runtime? This not works

 import std.traits;
 import std.experimental.logger;


 class A {
     int a,b;
     this(){}
     void fields(){
         log(FieldNameTuple!this);
     }
 }

 class B : A{
     int c;
     this(){}
 }

 void main(){
     B b = new B();
     b.fields();
 }
A few weeks ago I wrote an article for TWID that covers this very subject. Sadly because of a bug in dmd it doesn't work for all cases perfectly. http://arsdnet.net/this-week-in-d/2016-aug-28.html
Sep 15 2016
prev sibling parent reply Gary Willoughby <dev nomad.so> writes:
On Thursday, 15 September 2016 at 15:07:09 UTC, Ram_B wrote:
 How i can get fields of derived classes in runtime? This not 
 works
What about something like this: import std.traits; import std.stdio; class A { int a,b; this(){} void fields(this T)(){ writeln(FieldNameTuple!(T)); foreach(Class; TransitiveBaseTypeTuple!(T)) { writeln(FieldNameTuple!(Class)); } } } class B : A{ int c; this(){} } class C : B{ int d; this(){} } void main(){ C c = new C(); c.fields(); }
Sep 15 2016
next sibling parent Ram_B <zvolkzrus gmail.com> writes:
On Thursday, 15 September 2016 at 15:56:56 UTC, Gary Willoughby 
wrote:
 On Thursday, 15 September 2016 at 15:07:09 UTC, Ram_B wrote:
 How i can get fields of derived classes in runtime? This not 
 works
What about something like this: import std.traits; import std.stdio; class A { int a,b; this(){} void fields(this T)(){ writeln(FieldNameTuple!(T)); foreach(Class; TransitiveBaseTypeTuple!(T)) { writeln(FieldNameTuple!(Class)); } } } class B : A{ int c; this(){} } class C : B{ int d; this(){} } void main(){ C c = new C(); c.fields(); }
Thanks very much! :3
Sep 15 2016
prev sibling parent reply Ram_B <zvolkzrus gmail.com> writes:
On Thursday, 15 September 2016 at 15:56:56 UTC, Gary Willoughby 
wrote:
 On Thursday, 15 September 2016 at 15:07:09 UTC, Ram_B wrote:
 How i can get fields of derived classes in runtime? This not 
 works
What about something like this: import std.traits; import std.stdio; class A { int a,b; this(){} void fields(this T)(){ writeln(FieldNameTuple!(T)); foreach(Class; TransitiveBaseTypeTuple!(T)) { writeln(FieldNameTuple!(Class)); } } } class B : A{ int c; this(){} } class C : B{ int d; this(){} } void main(){ C c = new C(); c.fields(); }
This works, but i can't use (get|has)Member class A{ int a, b; Array!string fields(this T)(){ Array!string list; foreach(field; FieldNameTuple!(T)){ list.insertBack(field); } foreach(Class; TransitiveBaseTypeTuple!(T)){ foreach(field; FieldNameTuple!(Class)){ list.insertBack(field); } } return list; } void t(this T)(){ foreach(f; this.fields()){ log(__traits(hasMember, T, f)); } } } class B : A{ int c; this(){} } void main(){ B b = new B(); b.t(); } test.d(33): Error: variable f cannot be read at compile time test.d(33): Error: string expected as second argument of __traits hasMember instead of __error test.d(46): Error: template instance test.A.t!(B) error instantiating
Sep 15 2016
parent reply Gary Willoughby <dev nomad.so> writes:
On Thursday, 15 September 2016 at 22:05:55 UTC, Ram_B wrote:
 test.d(33): Error: variable f cannot be read at compile time
 test.d(33): Error: string expected as second argument of 
 __traits hasMember instead of __error
 test.d(46): Error: template instance test.A.t!(B) error 
 instantiating
Maybe Array!(string) can't be use in compile-time code?
Sep 16 2016
parent Ram_B <zvolkzrus gmail.com> writes:
On Friday, 16 September 2016 at 08:01:18 UTC, Gary Willoughby 
wrote:
 On Thursday, 15 September 2016 at 22:05:55 UTC, Ram_B wrote:
 test.d(33): Error: variable f cannot be read at compile time
 test.d(33): Error: string expected as second argument of 
 __traits hasMember instead of __error
 test.d(46): Error: template instance test.A.t!(B) error 
 instantiating
Maybe Array!(string) can't be use in compile-time code?
Which type of array i may use to pass it to compile-time function?
Sep 16 2016