2016-08-07 4 views

답변

2

물론 가능합니다. D의 반성 전원이 std.meta에서 귀하의 경우 Filter에, 엄청난 것은이 인수 함수를 처리하지 않습니다

struct Lion 
{ 
    static maxSpeed = 100; 
    string name; 
    bool isDangerous() 
    { 
     return true; 
    } 
    static bool isAlive(uint meat) 
    { 
     return meat > 100; 
    } 
} 

template FilterMembers(alias T, bool filterStatic = true) 
{ 
    import std.meta : Filter; 
    template filter(string member) 
    { 
     enum memberStr = T.stringof ~ "." ~ member; 
     enum isStatic = __traits(isStaticFunction, mixin(memberStr)) || 
         __traits(compiles, mixin("{auto b = " ~ memberStr ~ ";}")); 
     enum filter = filterStatic^isStatic; 
    } 
    enum FilterMembers = Filter!(filter, __traits(allMembers, T)); 
} 


unittest 
{ 
    import std.meta : AliasSeq; 
    assert(FilterMembers!Lion == AliasSeq!("name", "isDangerous")); 
    assert(FilterMembers!(Lion, false) == AliasSeq!("maxSpeed", "isAlive")); 
} 

// or using the old-school main 
version(unittest) {} else 
void main() 
{ 
    import std.stdio; 
    foreach (member; FilterMembers!Lion) 
     writeln(member); 
} 
+0

친구 ;-)하지만, 그는'__traits (isStaticFunction)'으로 처리 할 수 ​​있습니다. – rcorre

+0

오, 고마워요. 다른 누군가가 이것에 부딪 힐 경우에 대비하여, 그것을 업데이트했습니다 ;-) – greenify

+0

고마워요! 나는 또한 [witchcraft] (http://code.dlang.org/packages/witchcraft)를 발견했으며, 이것에 대한 좋은 라이브러리 솔루션처럼 보입니다. – rcorre