2
__traits(allMembers,Clazz)返回所有Clazz類成員。我可以使用「MemberFunctionsTuple」函數找到所有方法。但是,我怎樣才能得到模板方法?如何列出D中類的模板方法?
__traits(allMembers,Clazz)返回所有Clazz類成員。我可以使用「MemberFunctionsTuple」函數找到所有方法。但是,我怎樣才能得到模板方法?如何列出D中類的模板方法?
似乎(通過非常粗略的測試),這typeof(T.member)
將返回void
爲現場或非模板函數模板和非空(普通函數返回void
將void()
,不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
如果你確實想讓這樣的成員通過。
實際上,這也包括模板化的嵌套類型,我猜你不想要。嗯... – rcorre