fsw*_*fsw 4 templates d traits
如果我的术语有误,请原谅.
是否可以在D编程语言中确定类模板实例中类型参数的值?
请考虑以下类结构:
class Entity {
}
class User : Entity {
}
class Collection(E:Entity) {
}
class UsersCollection : Collection!(User) {
}
Run Code Online (Sandbox Code Playgroud)
现在,有权访问"UsersCollection",我可以确定它是Collection的子类,但我想确定它是什么类型的实体("User")的集合
这是我的实验:
import std.traits;
int main(){
pragma(msg, BaseTypeTuple!UsersCollection);
pragma(msg, TransitiveBaseTypeTuple!UsersCollection);
pragma(msg, BaseClassesTuple!UsersCollection);
//outputs:
//(in Collection!(User))
//(Collection!(User), Object)
//(Collection!(User), Object)
pragma(msg, UsersCollection);
pragma(msg, isInstanceOf!(Collection, UsersCollection));
//outputs:
//UsersCollection
//false
foreach(BC; BaseClassesTuple!UsersCollection){
pragma(msg, BC);
pragma(msg, isInstanceOf!(Collection, BC));
}
//outputs:
//Collection!(User)
//true
//Object
//false
return 0;
}
Run Code Online (Sandbox Code Playgroud)
正如您所看到的BaseClassesTuple的第一个元素!UsersCollection是"Collection!(User)"但是如何从中获取"User"?
您将要使用此http://dlang.org/expression.html#IsExpression的is表达式(文档中的表单#7):
static if(is(BaseClassesTuple!UsersCollection[0] == Collection!Type, Type)) {
// this is an instance of Collection
// with the argument passed as Type
pragma(msg, "MATCH!");
pragma(msg, Type);
}
Run Code Online (Sandbox Code Playgroud)
我们检查基类,看它的类型是否等于特定的声明.有效的方法是你基本上用占位符写出类型声明,然后用逗号分隔的你占用的占位符列表.
因此,"Collection!Type,Type"匹配任何已经实例化为Collection的东西,Type为参数.
然后,在静态if中,这些占位符可用作参数的别名.所以当我们Type在静态内部使用if时,它会告诉你arg是什么.在这里,我们拿出了Type.