2015-11-12 20 views

回答

2

似乎(通過非常粗略的測試),這typeof(T.member)將返回void爲現場或非模板函數模板和非空(普通函數返回voidvoid(),不void)。利用這一點:

import std.traits, std.meta; 

class C { 
    enum e = 5;   // compile-time value 
    int field;   // plain field, not a template 
    void fun() { }  // plain function, not a template 
    void tfun()() { } // templated function 
    template temp() { } // template 

    void both(int i) { } 
    void both(T : string)(T i) { } 
} 

template allTemplateMembers(T) { 
    enum isTemplateMember(string name) = is(typeof(mixin("T."~name)) == void); 

    alias allTemplateMembers = Filter!(isTemplateMember, __traits(allMembers, T)); 
} 

pragma(msg, allTemplateMembers!C); // tuple(tfun, temp) 

注意both沒有通過,因爲它同時具有模板和非模板超載。目前我不知道如何修改allTemplateMembers如果你確實想讓這樣的成員通過。

+0

實際上,這也包括模板化的嵌套類型,我猜你不想要。嗯... – rcorre