有没有办法将乘法返回的精度加倍(以避免溢出)?
template<class T> class MyClass {
T multiply (T a, T b) { return a * b; }
}
类似的东西:
long T multiply (T a, T b) { return a * b; }
因此,无论是'int','long'还是'double',都会从multipal返回'long int','long long'或'long double'。
这是一个普遍的问题。我正在通过内部使用double来解决它。但我的问题是,是否有任何机制可以将类型推广到C ++中的“长”变体?
答案 0 :(得分:14)
一种可能的解决方案是定义您自己的类型特征:
template<typename T>
struct add_long { typedef T type; };
template<>
struct add_long<int> { typedef long int type; };
template<>
struct add_long<double> { typedef long double type; };
template<>
struct add_long<long int> { typedef long long int type; };
// And so on...
这就是你在课堂上使用它的方法:
template<class T>
class MyClass {
public:
typedef typename add_long<T>::type longT;
longT multiply (longT a, longT b) { return a * b; }
};
这是一个小测试:
#include <type_traits>
int main()
{
MyClass<int> m;
auto l = m.multiply(2, 3);
static_assert(std::is_same<decltype(l), long int>::value, "Error!");
}
答案 1 :(得分:2)