D中的元组与类型元组

D中的元组与类型元组,d,D,Tuple和TypeTuple之间有什么区别?我看过库中的示例代码,但它们看起来很相似。我如何决定使用哪个?为什么Tuple在std.typecons中,而TypeTuple在std.TypeTuple中呢 元组正常值的普通元组 中的typetuple是类型的元组。它可以在编译时使用,就像在这个示例函数中一样,它将函数允许的类型限制为int、long和double void foo (T) (T arg) { static assert staticIndexOf!(T,TypeTupl

Tuple和TypeTuple之间有什么区别?我看过库中的示例代码,但它们看起来很相似。我如何决定使用哪个?为什么Tuple在std.typecons中,而TypeTuple在std.TypeTuple中呢

元组正常值的普通元组

中的typetuple是类型的元组。它可以在编译时使用,就像在这个示例函数中一样,它将函数允许的类型限制为int、long和double

void foo (T) (T arg) {
    static assert staticIndexOf!(T,TypeTuple!(int, long, double)) != -1, 
        T.stringof ~" is not allowed as argument for foo");
}

Tuple是变量的集合(如结构),而TypeTuple是可以在模板检查中使用的类型集合

Tuple!(int,"index",real,"value") var;
定义一个变量,其var.index为int,var.value为实数

当您想检查模板的实例化是否使用正确的类型时,将使用类型元组。a
Tuple
是一种数据类型,由您指定的字段集合组成

TypeTuple
只是编译器在编译时知道的“一堆东西”;它在运行时不存在


(与其名称相反,
TypeTuple
可以容纳几乎任何东西,而不仅仅是类型!)

请注意,这些都是基于库的解决方案,用于特殊目的。它们基于D的内置元组概念:@Trass3r,你是说D中有3种类型的元组?不,我只是说语言只有一种元组概念。您提到的Tuple和TypeTuple是基于库的。顺便说一句,原始元组可以用“template DTuple(T..{alias T DTuple;}”来“创建”,我觉得你的答案应该和Michal的结合在一起。