D 模板参数

D 模板参数,d,D,D是否支持模板参数?我怎样才能使以下各项发挥作用 struct Type(alias a, alias b) { alias a A; alias b B; } template MakeType(alias a, alias b) { alias Type!(a, b) MakeType; } template Foo(alias a, U) // where U is a Type { //... } template Foo(alias a, U : MakeType!(a,

D是否支持模板参数?我怎样才能使以下各项发挥作用

struct Type(alias a, alias b) { alias a A; alias b B; }

template MakeType(alias a, alias b)
{
  alias Type!(a, b) MakeType;
}

template Foo(alias a, U) // where U is a Type
{
  //...
}

template Foo(alias a, U : MakeType!(a, b), b...)  // where U is a specialization
{
  //...
}
Foo
应该这样称呼:

alias MakeType!(5, 7) MyType;
alias Foo!(5, MyType) Fooed;  // error
错误:模板实例Foo!(5,键入!(5,7))Foo!(5,Type!(5,7))与模板声明Foo(别名a,U:MakeType!(a,b),b…)不匹配

在使用中:

alias MakeType!(1, 3) MyType1;
alias MakeType!(5, 7) MyType2;
Foo!(5, MyType1) // calls the first Foo()
Foo!(5, MyType2) // calls the second Foo() with specialization

注意:在我的实际情况中,
a
b
不是简单的整数值;它们是用户定义类型的实例。这里的目标是从MakeType的其余参数中填充b,对吗?您可以手动检查它:“模板Foo(别名a,U,b…)if(is(U==MakeType!(a,b))”与“别名Foo!(5,MyType,7)Fooed”一起使用;但和和b都是显式给出的。现在,如果MyType有一个类型为b的成员,您可以很容易地将其导出,而不是作为模板参数,而是作为成员。比如:@AdamD.Ruppe我不能明确给出
a
b
。MyType可以有
a
b
的别名,我更改了代码以反映这一点。还要注意的是,
Foo
中的
U
是一种专门化。
alias MakeType!(1, 3) MyType1;
alias MakeType!(5, 7) MyType2;
Foo!(5, MyType1) // calls the first Foo()
Foo!(5, MyType2) // calls the second Foo() with specialization