此代码在getA!B()调用的第二个单元测试时失败。错误是:“需要'this‘表示’string‘类型的’值‘”
问题是。如何使getA始终返回A,无论UDA是类型还是opCall?
static A opCall(T...)(T args) {
A ret;
ret.value = args[0];
return ret;
}
string value;
}
@A struct B {
}
@A("hello") struct C {
}
A getA(T)() {
foreach(it; __traits(getAttributes, T)) {
if(is(typeof(it) == A)) {
A ret;
ret.value = it.value;
return ret;
}
}
assert(false);
}
unittest {
A a = getA!C();
assert(a.value == "hello");
}
unittest {
A a = getA!B();
assert(a.value == "");
}发布于 2014-06-17 10:01:18
如您所知,特征是在编译时进行评估的。因此,对通过__traits获得的值的任何内省都必须静态地进行。幸运的是,D有这方面的"静态中频条件“。
如果你改变了
if(is(typeof(it) == A)) {至
static if (is(typeof(it) == A)) {您应该不会在编译代码时遇到问题,因为is(typeof(it) == A可以在编译时进行评估。
https://stackoverflow.com/questions/24253431
复制相似问题