我觉得你有点希望。
template <typename T, typename U, typename resultType = double >
resultType sum(const vector<T>& vt, const vector<U>& vu)
{
// . . .
resultType sum = 0;
for (size_t i = 0; i < vt.size(); ++i) {
// two versions of sum - coerced to resultType before and after
// multiplication
sum += static_cast<resultType>(vt[i]) * static_cast<resultType>(vu[i]);
sum += static_cast<resultType>(vt[i] * vu[i]);
}
return sum;
}
sum+= 的 2 个版本会产生不同的结果。如果 sum 是整数,则可能会发生截断。
在 double 和 int 的乘法中,类型提升发生在一个中,但在另一个中进行规范化。
更新
使用 resultType = double
T 和 U 是双倍的 - 那么结果是一样的。
T 是整数 U 是双精度数。 T 升职加倍,结果是一样的。
T 和 U 是整数。 sum += static_cast<double>( vt[i] * vu[i] ); 将整数相乘,可能会溢出并返回不同的结果。
使用 resultType = int
T 和 U 是双精度的 - 结果要么是数字的整数截断,要么是结果的整数截断。
static_cast(5.3) * static_cast(3.7); => 15
static_cast(5.3 * 3.7); => static_cast(19.61) => 19
T 是整数 U 是双精度数。如上
T 和 U 是整数。两者都是一致的。
有一个类和一个
operator double() const { return value; }
按照其他帖子中的建议,第一个 sum += 将起作用,而第二个依赖于至少一个数字类型,因此编译器可以尝试显式 double 转换。
如果有两个class,那么sum += static_cast<resultType>(vt[i]) * static_cast<resultType>(vu[i]); 将成功找到双重运算符,但sum += static_cast<resultType>(vt[i]) * static_cast<resultType>(vu[i]); 将失败。
也是一个函数比如
operator *( const class X &lhs, const class U & rhs )
{
return static_cast<double>(lhs) * static_cast<double>(rhs);
}
会帮助编译器。