如何以模板类型名依赖的方式提高C++模板的精度?

Doc*_*awk 4 c++ templates stl

我有一个模板化的数学函数,它接受两个值,对它们进行一些数学运算,并返回相同类型的值.

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的用途.当我调用函数时,我宁愿不必指定它.

Dav*_*eas 5

您可以定义将生成所需类型的类型映射:

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使用的是(假设您的体系结构中没有更大的类型).

  • @mohawkjohn:基本模板将*定义*(在答案中仅声明)作为`template <typename T> struct long_type {typedef T type; `,即*,对于我们不知道更大类型的任何类型,在内部使用该类型* (2认同)

Mar*_*k B 5

假设你不需要处理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)