如何在D中列出类的模板方法?

时间:2015-11-12 17:34:44

标签: d

__ traits(allMembers,Clazz)返回所有类Clazz成员。我可以使用“MemberFunctionsTuple”函数找到所有方法。但是,我怎样才能获得模板方法?

1 个答案:

答案 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