2016-08-07 10 views

答えて

2

確かにこれを行うことができます。 D'sのイントロスペクション電力が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

関連する問題