我想创建一个虚拟结构,我的意思是输入范围。
您可以创建一个新的结构类型并作为输入范围。我知道
使用鸭子打字:-)
在我的情况下,如果有任何类型的结构,我想使用鸭子打字
有一个给定的属性。例如,如果至少有一个字段作为
@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/