编写泛型类时,我最终会遇到使用强制转换混乱的方法(否则会收到警告,这些警告会被视为我们项目的错误):
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
中使用了魔术常量。即使我将它们分开,也会增加混乱。无论哪种方式,这不是问题的重点:)
答案 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;
}
};