2

このコードは、getA!B() 呼び出しの 2 番目の単体テストで失敗します。エラーは次のとおりです。「タイプ「文字列」の「値」には「これ」が必要です」

質問は。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 にはこのための「static if 条件」があります。

変えたら

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

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

is(typeof(it) == Aコンパイル時に評価できるので、コードのコンパイルに問題はありません。

于 2014-06-17T10:01:18.873 に答える