我想要创建一个虚拟结构,我的意思是作为输入范围。您可以创建一个新的struct类型并作为一个输入范围。我知道用鸭子打字:-)
在我的例子中,如果任何类型的结构都有给定的属性,我想使用鸭子类型。例如,如果至少有一个字段为@MyUDA
有了这个,我可以将任何类型的结构发送到函数中。
struct MyUDA {}
struct A {
@MyUDA int a1;
@MyUDA float a2;
}
strct B {
@MyUDA string b;
}
A a;
B b;
foo( a );
foo( b );我希望这已经足够清楚了。
发布于 2014-05-26 23:45:26
关键是使用带助手函数的约束:
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");
}一旦您在函数中,您仍然必须查找成员并对它们执行一些操作,但是在这里,它将静态地拒绝没有标记成员的任何结构。
https://stackoverflow.com/questions/23874492
复制相似问题