Templates 检查类成员是否是静态的

Templates 检查类成员是否是静态的,templates,d,traits,Templates,D,Traits,我有这样的代码,我想检查我的模板(使用静态if),如果C.foo和C.bar是静态的或不是静态的: C类{ int foo; 静态输入条; } 我已经尝试过这些特性,但对于静态成员,它们似乎没有改变: pragma(msg,traits(hassmember,C,“foo”);//->真的 pragma(msg,u traits(hassmember,C.init,“foo”);//->真的 pragma(msg,uu traits(hassmember,C,“bar”);/>真的 pragm

我有这样的代码,我想检查我的模板(使用静态if),如果
C.foo
C.bar
是静态的或不是静态的:

C类{
int foo;
静态输入条;
}
我已经尝试过这些特性,但对于静态成员,它们似乎没有改变:

pragma(msg,traits(hassmember,C,“foo”);//->真的
pragma(msg,u traits(hassmember,C.init,“foo”);//->真的
pragma(msg,uu traits(hassmember,C,“bar”);/>真的
pragma(msg,u traits(hassmember,C.init,“bar”);/>真的
这种实际上适用于结构的方法也不适用于类:

pragma(msg,u traits(compiles,{enum tmp=u traits(getMember,C,“foo”);}));//->假的
pragma(msg,u traits(compiles,{enum tmp=u traits(getMember,C.init,“foo”);});//->假的
pragma(msg,uu traits(compiles,{enum tmp=u traits(getMember,C,“bar”)}));//->假的
pragma(msg,u traits(compiles,{enum tmp=u traits(getMember,C.init,“bar”);});//->假的

诀窍在于静态成员变量没有
offsetof
属性。所以,你可以这样做

模板isStaticMember(T,字符串memberName)
if(_特征(hasMember、T、memberName))
{
mixin(“别名成员=“~T.stringof~”~memberName~”;”;
枚举isStaticMember=!\u特征(编译,成员.offsetof);
}
C类
{
int foo;
静态输入条;
}
void main()
{
静态断言(!isStaticMember!(C,“foo”);
静态断言(isStaticMember!(C,“bar”);
}
std.traits中可能应该有这样的内容,但还没有。

对于方法(也被视为成员),您可以检查
\u traits(isStaticFunction)
。另请参阅