在D中,当模板具有与模板同名的成员时,模板的任何实例化都直接引用该成员。但如果该成员本身就是一个模板,我无法立即实例化它。但是,创建中间别名是有效的。
template Foo(int x){
template Foo(int y){
enum int Foo = x+y;
}
}
alias Foo1 = Foo!(1);
assert(Foo1!(2) == 3); // ok
int a = Foo!(1)!(1); // compile error Error: found '!' when expecting ')'
为什么这会失败?有没有办法解决这个问题?
我的目标是整洁和干练。
答案 0 :(得分:1)
这就是 D 语法的定义方式。当前编译器显示正确的错误消息:
Error: multiple ! arguments are not allowed
此问题也已归档为Issue 1566和issue comment 4:
如果我不想错过多个
!
被视为有害的内容,A!B!C
可能会有害 被视为A
实例化B!C
或A!B
实例化C
。也 在这种情况下总是要有parantheses的要求可以添加,但IMO 看起来并不像一个有价值的语言并发症,因为它不是一般的 需要的。
这可以通过例如这样的Inst
模板:
template Foo(int x)
{ enum int Foo(int y) = x + y; }
alias Inst(alias Template, A...) = Template!A;
enum a = Inst!(Foo!1, 1);
注意 D 现在有一个新的短模板声明语法,并且在模板参数是标识符或常量的情况下,也不需要使用parantheses。