根据documentation,__ traits(hasMember,...)应该适用于任何具有成员的类型,但我无法获得使用它来编译类的代码。请观察以下代码段:
struct A {
int foo;
}
static assert(__traits(hasMember, A, "foo"));
这编译(虽然它不会链接,因为没有主要)。但是,如果我将“struct A”更改为“A类”,则静态断言将触发,代码将无法编译。我在bug追踪器中找不到任何东西,看起来这是视力表上的一个大E。我做错了吗?
- 编辑: 以getMember为例,如果foo是静态的,则hasMember似乎只适用于该类。或者,我可以实例化A并使用非静态foo测试实例。问题是,我需要在编译时测试类的非静态成员的存在。
答案 0 :(得分:1)
经过一番反思,我认为这是预期的行为。似乎合理的是hasMember应该与getMember一起使用,或者如果hasMember为true,则设置或调用该成员必须是合法的。显然这对于类没有意义 - 除非字段或方法是静态的,否则在没有实例的情况下不能设置或调用它。也许一个instanceHasMember特征是有序的,或者至少是文档中的一个注释。
目前,我使用经过时间考验的
is(typeof(mixin(`thing.`~member)))
在编译时测试它。