annotations - 如何创建虚拟类型以授予给定结构具有注释@xxxx 的某些字段?

标签 annotations d

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

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

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

struct MyUDA {}

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


strct B {
  @MyUDA string b;
}

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

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

最佳答案

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

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

一旦你进入函数内部,你仍然需要寻找成员并用它们做一些事情,但是你已经找到了,它会静态拒绝任何没有标记成员的结构。

关于annotations - 如何创建虚拟类型以授予给定结构具有注释@xxxx 的某些字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23874492/

相关文章:

swift - 制作多个引脚注释按钮以连接到另一个 View Controller (swift 3)

function - 将函数转换为委托(delegate)

multithreading - 不允许使用可变线程本地数据的别名

templates - 用于定义具有相同成员的结构的 Mixin 模板

JDBC 结果集/语句中的 Java 内存泄漏

java - 改为调用其他方法

d 编程语言中的 foreach 语句重载

garbage-collection - 将 D 用于实时应用程序?

java - JPA/hibernate : How to pass value in @where clause

Spring Cloud - SQS - 此wsdl版本的指定队列不存在