2016-09-10 3 views
3

이 같은 코드를 가지고 C.fooC.bar은 정적 또는하지 않은 경우 나, (만약 정적을 사용) 내 템플릿에 확인 할 : 선택하면

class C { 
    int foo; 
    static int bar; 
} 

는 이미 이러한 특성을 시도 하지만 그들은 정적 멤버에 대한 변경하지 않는 것 :

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 

실제로 수업이 작동하지 않습니다 구조체 작동이 해킹 중 하나

pragma(msg, __traits(compiles, { enum tmp = __traits(getMember, C, "foo"); })); // -> false 
pragma(msg, __traits(compiles, { enum tmp = __traits(getMember, C.init, "foo"); })); // -> false 
pragma(msg, __traits(compiles, { enum tmp = __traits(getMember, C, "bar"); })); // -> false 
pragma(msg, __traits(compiles, { enum tmp = __traits(getMember, C.init, "bar"); })); // -> false 
+0

[이 관련 질문] (http://stackoverflow.com/questions/38813868/how-can-get-all-non-static-members-of-a-type?s=8%7C0.0000)을 참조하십시오.) – rcorre

답변

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에 뭔가가 있어야하지만 아직 없다.

+0

(멤버로도 간주되는) 메소드의 경우'__traits (isStaticFunction)'을 검사 할 수 있습니다. – rcorre