C++中用于在数字类型之间进行转换的最佳实践

kei*_*ith 11 c++ casting numeric-conversion

在不同数字类型之间进行投射的最佳做法是什么?类型float,double,int是+ +我使用C中的大多数人.

选项的一个示例,其中fa floatndouble或者int:

float f = static_cast<float>(n);
float f = float(n);
float f = (float)n;
Run Code Online (Sandbox Code Playgroud)

我经常写,static_cast<T>(...)但想知道如果有一种首选方式,C++开发社区是否有任何共识.

我很欣赏这可能最终成为一个基于意见的问题而且可能没有"标准"的方式,在这种情况下请告诉我没有标准方法,所以至少我知道:-)

我知道这个问题已经出现了相对于一般的铸造,但是,我对数字特别有兴趣和是否有针对数种办法具体的最佳实践.

man*_*lio 7

只是用static_cast.C强制转换的问题是操作的模糊性(即显式类型转换的点(1)).

C++演员避免这种情况.另外,C++强制转换在搜索时更加明显.

使用Stroustrup的话(static_cast有什么用?):

如果在开发或维护过程中,其中一种类型发生了变化,即使看起来无辜的演员也会成为一个严重的问题.例如,这是什么意思?:

  x = (T)y;
Run Code Online (Sandbox Code Playgroud)

我们不知道.这取决于Tx和y 的类型和类型.T可以是类,a typedef或模板参数的名称.也许xy是标量变量,(T)代表价值的转换.也许x是一个派生自y班级的班级,(T)是一个沮丧的人.也许xy不相关的指针类型.因为C风格的强制转换(T)可用于表达许多逻辑上不同的操作,所以编译器只有最小的机会来捕获错误.出于同样的原因,程序员可能不知道演员的具体内容.这有时被新手程序员认为是一个优点,并且当新手猜错时是一个微妙错误的来源.

引入了"新式演员阵容",使程序员有机会更清楚地表达他们的意图,并让编译器捕获更多错误.

[切]

引入新式演员阵容的第二个原因是C风格的演员阵容很难在节目中发现.例如,您无法使用普通编辑器或文字处理器方便地搜索强制转换.

[切]

在现代C++中,强制转换实际上是可以避免的

还要考虑boost::numeric::converter/ boost::numeric_cast更安全的替代品(Boost.NumericConversion库的一部分).

例如

#include <iostream>
#include <boost/numeric/conversion/cast.hpp>

int main()
{
  using boost::numeric_cast;

  using boost::numeric::bad_numeric_cast;
  using boost::numeric::positive_overflow;
  using boost::numeric::negative_overflow;

  try
  {
    int i = 42;
    short s = numeric_cast<short>(i); // This conversion succeeds (is in range)
  }
  catch(negative_overflow &e)  { std::cout << e.what(); }
  catch(positive_overflow &e)  { std::cout << e.what(); }

  return 0;
}
Run Code Online (Sandbox Code Playgroud)

通常,对于隐式转换和显式转换(通过static_cast),缺少范围保留会使数字类型之间的转换容易出错.

numeric_cast 转换数字类型时检测范围丢失,如果无法保留范围则抛出异常.


归档时间:

查看次数:

7661 次

最近记录:

9 年,6 月 前