使用D traits获取其实例的模板参数值

时间:2014-05-14 12:30:18

标签: templates d traits

如果我的术语有误,请原谅。

是否可以在D编程语言中确定类模板实例中类型参数的值?

请考虑以下课程结构:

class Entity {
}

class User : Entity {
}

class Collection(E:Entity) {
}

class UsersCollection : Collection!(User) {
}

现在,可以访问" 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;
}

当你看到BaseClassesTuple的第一个元素时!UsersCollection是" Collection!(User)"但如何获得"用户"出来的?

1 个答案:

答案 0 :(得分:5)

您需要使用此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);
    }

我们检查基类,看它的类型是否等于特定的声明。有效的方法是你基本上用占位符写出类型声明,然后用逗号分隔的你占用的占位符列表。

所以“Collection!Type,Type”匹配任何已经实例化为Collection的东西,Type为参数。

然后,在静态if中,这些占位符可用作参数的别名。所以当我们在静态if中使用Type时,它会告诉你arg是什么。在这里,我们得到了Type。