D 无法推断模板化ufcs函数的类型

D 无法推断模板化ufcs函数的类型,d,D,为什么我必须使用显式类型调用isSome和isNone?你不应该推断出这些类型吗 我想这是因为Optional(T)只是一个类型别名?我认为这是一个DMD错误,这一点在本文中也指出了 一旦对模板使用别名,模板参数推断就会失败。您要求它仅推断部分类型。。。虽然这个别名确实让人困惑。我不确定编译器是否可以去掉那么多层模板。不仅是化名,还有Algebriac!(一些!T)也有点隐藏在里面。但我认为它应该能够…。。@AdamD.Ruppe是的,我已经用一种新类型包装了它,现在它可以工作了。 struct

为什么我必须使用显式类型调用
isSome
isNone
?你不应该推断出这些类型吗


我想这是因为
Optional(T)
只是一个类型别名?

我认为这是一个DMD错误,这一点在本文中也指出了


一旦对模板使用别名,模板参数推断就会失败。

您要求它仅推断部分类型。。。虽然这个别名确实让人困惑。我不确定编译器是否可以去掉那么多层模板。不仅是化名,还有Algebriac!(一些!T)也有点隐藏在里面。但我认为它应该能够…。。@AdamD.Ruppe是的,我已经用一种新类型包装了它,现在它可以工作了。
struct None{};
struct Some(T){
  T value;
}
Optional!T some(T)(T value){
  return Optional!T(Some!T(value));
}
bool isNone(T)(ref Optional!T optional){
  return optional.peek!None != null;
}
bool isSome(T)(ref Optional!T optional){
  return optional.peek!(Some!T) != null;
}
Optional!T none(T)(){
  return Optional!T(None());
}
alias Optional(T) = std.variant.Algebraic!(Some!(T),None);
void main()
{
  Optional!int si = none!int();
  writeln(isNone!int(si));
  writeln(isSome(si)); //cannot deduce function from argument types
}