D类型推断取决于模板参数的顺序

时间:2013-04-17 04:51:47

标签: templates d type-inference dmd

T maybe(alias nullCheck, T)(T expr, T def)
{
    if (nullCheck(expr))
    {
        return def;
    }
    else
    {
        return expr;
    }
}

auto tokens = chomp(readln())
              .toLower()
              .split()
              .maybe!(a => a.empty)([""])

maybe的模板参数与首先出现的别名一起排列时,编译器能够正确地推断出参数类型。但是,当切换模板参数使得T首先出现时,它不能推断它们,并且不会编译。这是为什么?

1 个答案:

答案 0 :(得分:3)

这是因为模板参数是在所有位置参数之后。 如果nullCheck是第二个参数,则必须先指定T,然后才能指定nullCheck

编译器可以(非正式地)仅尝试推断最后一个位置参数右侧的参数,就像它们是默认参数一样。

请注意,这与C ++中的相同,如果您考虑一下,这是合理的。