解决返回 auto
的函数不同的 return
语句推导出不同类型的方式与解决其他任何返回 auto
的函数相同。您可以:
- 确保所有的
return
语句都有相同的类型,或者
- 明确选择一个返回类型。
在这种情况下,int
比较为 strong_ordering
,而 double
比较为 partial_ordering
,且 strong_ordering
隐式可转换为 partial_ordering
,您可以执行以下任一操作:
std::partial_ordering operator <=>(const QVariant& l, const QVariant& r) {
}
或者明确地将整数比较转换为:
case QMetaType::Int:
return std::partial_ordering(l.toInt() <=> r.toInt());
这将给你一个返回partial_ordering
的函数。
如果你想返回strong_ordering
,那么你需要将double
比较提升到更高的类别。你可以用两种方法实现:
你可以使用std::strong_order
,这是一种更昂贵的操作,但提供了所有浮点数值的完全排序。你可以这样写:
case QMetaType::Double:
return std::strong_order(l.toDouble(), r.toDouble());
或者你可以像考虑 NaN
无效一样,采取某些方法将其排除:
case QMetaType::Double: {
auto c = l.toDouble() <=> r.toDouble();
if (c == std::partial_ordering::unordered) {
throw something;
} else if (c == std::partial_ordering::less) {
return std::strong_ordering::less;
} else if (c == std::partial_ordering::equivalent) {
return std::strong_ordering::equal;
} else {
return std::strong_ordering::greater;
}
}
这种提升的方式可能更加繁琐,但我不确定是否有更直接的方法。
<=>
不需要表现对称吗?仅通过打开l.type()
,您就违反了该属性。 - Bergi