__traits(allMembers, Clazz) 返回所有类 Clazz 成员。我可以找到使用“MemberFunctionsTuple”函数的所有方法。但我怎样才能只获取模板方法呢?
最佳答案
看起来(通过非常粗略的测试),typeof(T.member)
将为模板返回 void
,为字段或非模板返回非 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
。
关于d - 如何列出D中类的模板方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33677716/