2

此代码在 getA!B() 调用的第二个单元测试中失败。错误是:“对于'string'类型的'value'需要'this'”

问题是。无论 UDA 是类型还是 opCall,如何让 getA 始终返回 A?

    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 == "");
}
4

1 回答 1

2

如您所知,特征是在编译时评估的。因此,对通过 __traits 获得的值的任何内省都必须静态完成。幸运的是,D 对此有“静态条件”。

如果你改变

if(is(typeof(it) == A)) {

static if (is(typeof(it) == A)) {

您应该不会在编译代码时遇到问题,因为is(typeof(it) == A可以在编译时进行评估。

于 2014-06-17T10:01:18.873 回答