有没有办法加倍乘法返回的精度(以避免溢出)?
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”,都会从乘法中返回“long int”,“long long”或“long double”.
这是一个普遍的问题.我正在使用内部的双重工作.但我的问题是,是否有任何机制来推广一种类型到C的“长”变体?
解决方法
一个可能的解决方案是定义自己的类型特征:
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!"); }
原文地址:https://www.jb51.cc/c/116145.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。