Templates 使用D traits获取其实例的模板参数值
如果我的术语有误,请原谅 是否可以在D编程语言的类模板实例中确定类型参数的值Templates 使用D traits获取其实例的模板参数值,templates,d,traits,Templates,D,Traits,如果我的术语有误,请原谅 是否可以在D编程语言的类模板实例中确定类型参数的值 请考虑以下类结构: class Entity { } class User : Entity { } class Collection(E:Entity) { } class UsersCollection : Collection!(User) { } 现在,通过访问“UsersCollection”,我可以确定它是集合的一个子类,但我想确定它是集合的哪种类型的实体(“用户”) 以下是我的实验: import
请考虑以下类结构:
class Entity {
}
class User : Entity {
}
class Collection(E:Entity) {
}
class UsersCollection : Collection!(User) {
}
现在,通过访问“UsersCollection”,我可以确定它是集合的一个子类,但我想确定它是集合的哪种类型的实体(“用户”)
以下是我的实验:
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;
}
正如您看到的BaseClassesTuple的第一个元素!UsersCollection是“Collection!(User)”,但如何从中获取“User”?您需要为此使用is表达式(文档中的表格#7): 我们检查基类,看看它的类型是否等于一个特定的声明。其工作方式基本上是用占位符写出类型声明,然后列出所用占位符的逗号分隔列表 所以“Collection!Type,Type”匹配任何将被实例化为Collection的对象,Type是参数 然后,在静态if中,这些占位符可以作为参数的别名使用。因此,当我们在静态if中使用
Type
时,它会告诉您arg是什么。在这里,我们得到了类型
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);
}