检查 class 成员是否是静态的
Check if class member is static
我有这样的代码,我想检查我的模板(使用静态 if),如果 C.foo
和 C.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
这个实际上适用于结构的 hack 不适用于 类:
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
诀窍在于静态成员变量没有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 中可能应该有这方面的内容,但目前还没有。
我有这样的代码,我想检查我的模板(使用静态 if),如果 C.foo
和 C.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
这个实际上适用于结构的 hack 不适用于 类:
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
诀窍在于静态成员变量没有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 中可能应该有这方面的内容,但目前还没有。