可以使用条件运算符统一返回类型:

template <typename T1, typename T2>
auto max(T1 a, T2 b) -> decltype(true ? a : b) {      // true ? a : b
  return b < a ? a : b;
}

条件运算符 (:?:) 是一个三元运算符 (它采用三个操作数)。条件运算符工作如下所示:

  • 第一个操作数的结果隐式转换成bool型

  • 计算结果为 true ,第二个操作数计算并返回

  • 计算结果为 false ,第三个操作数计算并返回

条件表达式具有从右向左的结合性。第一个操作数必须是整型或指针类型。下列规则适用于第二个和第三个表达式:

  • 如果两个表达式的类型相同,则结果是该类型。
  • 如果两个表达式都为算术或枚举类型,通常算术转换执行转换通用类型。
  • 如果两个表达式是指针类型,或者一个是指针类型而另一个是计算结果为 0 的常数表达式,指针转换执行转换通用类型。
  • 如果两个表达式都是引用类型,则执行引用转换以将它们转换为公共类型。
  • 如果两个表达式都是 void 类型,则公共类型是 void 类型。
  • 如果两个表达式都属于给定的类类型,则通用类型是该类类型

第二个和第三个操作数的任意组合不在上述列表是非法的。结果的类型是普通类型,如果第二个和第三个操作数都是相同的类型并且都是左值,那么它就是一个左值。

Conditional Operator: ? : | Microsoft Docs