首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何创建虚拟类型以授予给定的struct具有注释@xxxx的字段?

如何创建虚拟类型以授予给定的struct具有注释@xxxx的字段?
EN

Stack Overflow用户
提问于 2014-05-26 16:38:54
回答 1查看 44关注 0票数 4

我想要创建一个虚拟结构,我的意思是作为输入范围。您可以创建一个新的struct类型并作为一个输入范围。我知道用鸭子打字:-)

在我的例子中,如果任何类型的结构都有给定的属性,我想使用鸭子类型。例如,如果至少有一个字段为@MyUDA

有了这个,我可以将任何类型的结构发送到函数中。

代码语言:javascript
运行
复制
struct MyUDA {}

struct A {
  @MyUDA int a1;
  @MyUDA float a2;
}


strct B {
  @MyUDA string b;
}

A a;
B b;
foo( a );
foo( b );

我希望这已经足够清楚了。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-05-26 23:45:26

关键是使用带助手函数的约束:

代码语言:javascript
运行
复制
enum MyUDA; // instead of struct so @MyUDA works instead of @MyUDA()

struct A {
  @MyUDA int a1;
  @MyUDA float a2;
}


struct B {
  @MyUDA string b;
}

void main() {
    A a;
    B b;
    foo( a );
    foo( b );
}

// this looks for the uda on a member
template HasMyUDA(T) {
    static bool helper() {
        foreach(memberName; __traits(allMembers, T)) {
            foreach(attr; __traits(getAttributes, __traits(getMember, T, memberName)))
                static if(is(attr == MyUDA))
                    return true;
        }
        return false;
    }

    enum HasMyUDA = helper();
}

// test usage
void foo(T)(T t) if(HasMyUDA!T) {
    pragma(msg, T.stringof ~ " works here");
}

一旦您在函数中,您仍然必须查找成员并对它们执行一些操作,但是在这里,它将静态地拒绝没有标记成员的任何结构。

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

https://stackoverflow.com/questions/23874492

复制
相关文章

相似问题

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