我有一个模板化的数学函数,它接受两个值,对它们进行一些数学运算,并返回相同类型的值.
template <typename T>
T math_function(T a, T b) {
LongT x = MATH_OP1(a,b);
return MATH_OP2(x,a);
}
Run Code Online (Sandbox Code Playgroud)
我想将中间值(在x中)存储在一个类型中,该类型基本上是T的长版本(上面称为LongT).所以,如果T是浮点数,我希望x是双精度数; 如果T是一个int,我希望x是一个long int.
有没有办法实现这个目标?我试过了enable_if,但似乎我真的需要一个enable_if_else.
我更愿意让编译器自己弄清楚LongT的用途.当我调用函数时,我宁愿不必指定它.
您可以定义将生成所需类型的类型映射:
template <typename T> struct long_type;
template <> struct long_type<int> {
typedef long type;
};
template <> struct long_type<float> {
typedef double type;
};
Run Code Online (Sandbox Code Playgroud)
然后使用该元函数:
template <typename T>
T math_function(T a, T b) {
typename long_type<T>::type x = MATH_OP1(a,b);
return static_cast<T>(MATH_OP2(x,a));
}
Run Code Online (Sandbox Code Playgroud)
使用此特定实现,您的模板将无法编译除您提供long_type特征的类型之外的任何类型.您可能希望提供仅映射到自身的通用版本,以便在输入时long long int使用的是(假设您的体系结构中没有更大的类型).
假设你不需要处理T=long例如,只需为int和创建特征float:
template <typename T>
struct LongT;
template <>
struct LongT<int>
{
typedef long value_type;
};
template <>
struct LongT<float>
{
typedef double value_type;
};
template <typename T>
T math_function(T a, T b) {
typename LongT<T>::value_type x = MATH_OP1(a,b);
return MATH_OP2(x,a);
}
Run Code Online (Sandbox Code Playgroud)