为什么我不能使用同名技巧链接实例化?

时间:2014-03-17 16:48:20

标签: templates d currying

在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 ')'

为什么这会失败?有没有办法解决这个问题?

我的目标是整洁和干练。

1 个答案:

答案 0 :(得分:1)

这就是 D 语法的定义方式。当前编译器显示正确的错误消息:

Error: multiple ! arguments are not allowed

此问题也已归档为Issue 1566issue comment 4

  

如果我不想错过多个!被视为有害的内容,A!B!C可能会有害   被视为A实例化B!CA!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。