无法推断模板化 ufcs 函数的类型
Unable to infer the types for templated ufcs functions
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
}
为什么我必须使用显式类型调用 isSome
和 isNone
? D 不应该能够推断出类型吗?
我猜这是因为 Optional(T)
只是一个类型别名?
我认为这是一个 DMD 错误,与此 NG thread 中指出的相同。
模板别名化后,模板参数推导失败
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
}
为什么我必须使用显式类型调用 isSome
和 isNone
? D 不应该能够推断出类型吗?
我猜这是因为 Optional(T)
只是一个类型别名?
我认为这是一个 DMD 错误,与此 NG thread 中指出的相同。
模板别名化后,模板参数推导失败