【问题标题】:get template parameter value for its instance using D traits使用 D 特征获取其实例的模板参数值
【发布时间】:2014-07-02 12:27:00
【问题描述】:

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

是否可以在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)”,但如何从中取出“User”?

【问题讨论】:

    标签: templates d traits


    【解决方案1】:

    您需要为此 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。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-25
      • 2018-09-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多