首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >UDA opCall __traits

UDA opCall __traits
EN

Stack Overflow用户
提问于 2014-06-16 22:57:44
回答 1查看 58关注 0票数 2

此代码在getA!B()调用的第二个单元测试时失败。错误是:“需要'this‘表示’string‘类型的’值‘”

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

代码语言:javascript
复制
    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 == "");
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-06-17 10:01:18

如您所知,特征是在编译时进行评估的。因此,对通过__traits获得的值的任何内省都必须静态地进行。幸运的是,D有这方面的"静态中频条件“。

如果你改变了

代码语言:javascript
复制
if(is(typeof(it) == A)) {

代码语言:javascript
复制
static if (is(typeof(it) == A)) {

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24253431

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档