December 16, 2014 UDA and mixins | ||||
---|---|---|---|---|
| ||||
I want to write mixin template, what past and/or change some code in class. Mixin must get all functions with user defined attribute and past fields for example. It should looks like this struct FooPasted(Args...){} class A { mixin foo; void func1() @mark { ... } void func2( int x, string a ) @mark { ... } } Question 1: I get members with @mark via this template: template filterMembers(alias F,T,string[] list=[]) if( is( T == class ) || is( T == struct ) ) { static if( list.length > 0 ) enum filterMembers = impl!list; else enum filterMembers = impl!([__traits(allMembers,T)]); string[] impl(string[] names)() @property { static if( names.length == 0 ) return []; else static if( names.length == 1 ) { enum n = names[0]; static if( __traits(compiles,__traits(getMember,T,n)) ) return F!(__traits(getMember,T,n)) ? [n] : []; else return []; } else return impl!(names[0..$/2]) ~ impl!(names[$/2..$]); } } an easier way to do this exists? something like __traits(UDAMembers,T,mark) Question 2: Can i change or remove exists code via mixin? definition class X { mixin foo; void func() @impl; } change to class X { void func() { ... implement by foo ... } } |
December 16, 2014 Re: UDA and mixins | ||||
---|---|---|---|---|
| ||||
Posted in reply to Oleg | struct FooPasted(Args...){} class A { mixin foo; void func1() @mark { ... } void func2( int x, string a ) @mark { ... } } must change to: class A { void func1() @mark { ... } void func2( int x, string a ) @mark { ... } FooPasted!() func1_mark; FooPasted!(int,string) func2_mark; } |
Copyright © 1999-2021 by the D Language Foundation