检查类成员是否是静态的

时间:2016-09-10 21:23:13

标签: templates d traits

我有这样的代码,我想检查我的模板(使用静态if),如果require '/home/arslanali/personalproject/lib/custom_breadcrumbs_builder.rb' C.foo是静态的:

C.bar

我已尝试过这些特性,但静态成员似乎没有改变:

class C {
    int foo;
    static int bar;
}

这个实际适用于结构的hack不适用于类:

pragma(msg, __traits(hasMember, C, "foo")); // -> true
pragma(msg, __traits(hasMember, C.init, "foo")); // -> true
pragma(msg, __traits(hasMember, C, "bar")); // -> true
pragma(msg, __traits(hasMember, C.init, "bar")); // -> true

1 个答案:

答案 0 :(得分:4)

诀窍是静态成员变量没有offsetof属性。所以,你可以做类似

的事情
template isStaticMember(T, string memberName)
    if(__traits(hasMember, T, memberName))
{
    mixin("alias member = " ~ T.stringof ~ "." ~ memberName ~ ";");
    enum isStaticMember = !__traits(compiles, member.offsetof);
}

class C
{
    int foo;
    static int bar;
}

void main()
{
    static assert(!isStaticMember!(C, "foo"));
    static assert(isStaticMember!(C, "bar"));
}

std.traits可能应该有一些东西,但还没有。