你要的是std::common_type:
template<typename T0, typename T1>
typename std::common_type<T0, T1>::type add(T0 a, T1 b) {
return a+b;
}
文档说明:
对于算术类型,通用类型可以被视为(可能是混合模式)算术表达式的类型,例如 T0() + T1() + ... + Tn()。
但是,正如 cmets 中的 @Jarod42 所指出的,这只是一种观点,在某些情况下可能是错误的:例如,std::common_type<char, char>::type 是 char,而算术表达式 char() + char() 产生 int。
更完整的实现可能会显式转换结果以消除上述情况下可能出现的警告:
template<typename T0, typename T1, typename R = std::common_type_t<T0, T1>>
R add(T0 a, T1 b) {
return static_cast<R>(a+b);
}
这里std::common_type默认用于返回类型,但由于它是模板参数,你可以在使用函数时指定不同的类型(可能在更复杂的用例中有用):
char a = 1, b = 2;
add<decltype(a), decltype(b), int>(a, b);
使用std::conditional和std::is_same,在cmets中@Jarod42提出的更完整的解决方案允许以模板R作为第一个参数,并保持a和b的自动推导:
template <typename R, typename T0, typename T1>
using ResType = std::conditional_t<
std::is_same<void, R>::value,
std::common_type_t<T0, T1>, // default
R // R was explicitly specified: use it
>;
template <typename R = void, typename T0, typename T1>
ResType<R, T0, T1> add(T0 a, T1 b)
{
return static_cast<ResType<R, T0, T1>>(a + b);
}
用法:
char a = 1, b = 2;
add(a, b); // returns char
add<int>(a, b); // returns int