将C ++模板类型T修改为“long T”?

时间:2013-03-07 23:07:34

标签: c++ templates types

有没有办法将乘法返回的精度加倍(以避免溢出)?

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 ++中的“长”变体?

2 个答案:

答案 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)