如何获取类型的所有非静态成员? [英] How can get all non-static members of a type?
本文介绍了如何获取类型的所有非静态成员?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
__ traits(allMembers,T)
返回实例成员和静态成员。如何过滤出静态成员?我希望这对字段和方法都适用。
__traits(allMembers, T)
returns both instance and static members. How can I filter out the static members? I'd like this to work for both fields and methods.
推荐答案
当然可以。 D的自省能力是巨大的,在您的情况下过滤器来自 std .meta
是您的朋友;-)
Sure you can do this. D's introspection power is immense, in your case Filter from std.meta
is your friend ;-)
struct Lion
{
static maxSpeed = 100;
string name;
bool isDangerous()
{
return true;
}
static bool isAlive(uint meat)
{
return meat > 100;
}
}
template FilterMembers(alias T, bool filterStatic = true)
{
import std.meta : Filter;
template filter(string member)
{
enum memberStr = T.stringof ~ "." ~ member;
enum isStatic = __traits(isStaticFunction, mixin(memberStr)) ||
__traits(compiles, mixin("{auto b = " ~ memberStr ~ ";}"));
enum filter = filterStatic ^ isStatic;
}
enum FilterMembers = Filter!(filter, __traits(allMembers, T));
}
unittest
{
import std.meta : AliasSeq;
assert(FilterMembers!Lion == AliasSeq!("name", "isDangerous"));
assert(FilterMembers!(Lion, false) == AliasSeq!("maxSpeed", "isAlive"));
}
// or using the old-school main
version(unittest) {} else
void main()
{
import std.stdio;
foreach (member; FilterMembers!Lion)
writeln(member);
}
这篇关于如何获取类型的所有非静态成员?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文