UDA opCall __traits

时间:2014-06-16 22:57:45

标签: attributes d ctfe

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

问题是。如何让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 == "");
}

1 个答案:

答案 0 :(得分:2)

如您所知,traits在编译时进行评估。因此,通过__traits获得的值的任何内省都必须静态完成。幸运的是D有“static if condition”。

如果你改变了

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

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

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