减少C ++中的转换杂乱

时间:2012-03-01 23:54:27

标签: c++ templates casting

编写泛型类时,我最终会遇到使用强制转换混乱的方法(否则会收到警告,这些警告会被视为我们项目的错误):

template <typename floatType>
class foo
{
public:
  typedef floatType real_type;

  real_type bar()
  {
    real_type a = (real_type)0.5; // should I be using static_cast? Either way, the code becomes cluttered quickly
    real_type b = a + 0.6; // warning here for floatType = float

    real_type someLongEquation = a + ((real_type)0.5 * (real_type)100) + (real_type)17.0;

    return a + b + someLongEquation;
  }
};

int main()
{
  {
    foo<float> z;
    z.bar();
  }

  {
    foo<double> z;
    z.bar();
  }

  return 0;
}

有没有办法减少这种混乱?

请注意,我意识到我在someLongEquation中使用了魔术常量。即使我将它们分开,也会增加混乱。无论哪种方式,这不是问题的重点:)

2 个答案:

答案 0 :(得分:0)

一种简单的方法就是关闭代码周围的警告。使用MSVC:

#pragma warning(push) // save warnings state
#pragma warning(disable:4244) // narrowing conversion
// code here ...
#pragma warning(pop) // restore warnings

然而,更好的方法是只使用float文字,如果你的魔术常数不需要double的扩展精度。只需将f附加到您的浮点文字即可,您就可以了。此外,100不需要演员表。如果你确实需要精确度,那么,回过头来禁用警告。

答案 1 :(得分:0)

您应该将魔术常量分开并将它们存储在正确的泛型类型中。所有演员都将被限制在该位置。现在(我认为)C ++ 11允许在非整数const静态的类初始化中很容易。

template <typename floatType>
class foo
{
public:
  typedef floatType real_type;

  static constexpr real_type A = real_type(0.5);
  static constexpr real_type B = real_type(0.6);
  static constexpr real_type C = real_type(100.0);
  static constexpr real_type D = real_type(17.0);

  real_type bar()
  {
    real_type a = A;
    real_type b = a + B;

    real_type someLongEquation = a + (A * C) + D;

    return a + b + someLongEquation;
  }
};