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首先出现时,它不能推断它们,并且不会编译。这是为什么?
答案 0 :(得分:3)
这是因为模板参数是在所有位置参数之后。
如果nullCheck
是第二个参数,则必须先指定T
,然后才能指定nullCheck
。
编译器可以(非正式地)仅尝试推断最后一个位置参数右侧的参数,就像它们是默认参数一样。
请注意,这与C ++中的相同,如果您考虑一下,这是合理的。