__ traits(allMembers,Clazz)返回所有类Clazz成员。我可以使用“MemberFunctionsTuple”函数找到所有方法。但是,我怎样才能获得模板方法?
答案 0 :(得分:2)
似乎(通过非常粗略的测试),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
。