kei*_*ith 11 c++ casting numeric-conversion
在不同数字类型之间进行投射的最佳做法是什么?类型float,double,int是+ +我使用C中的大多数人.
选项的一个示例,其中fa float和n是double或者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++开发社区是否有任何共识.
我很欣赏这可能最终成为一个基于意见的问题而且可能没有"标准"的方式,在这种情况下请告诉我没有标准方法,所以至少我知道:-)
我知道这个问题已经出现了相对于一般的铸造,但是,我对数字特别有兴趣和是否有针对数种办法具体的最佳实践.
只是用static_cast.C强制转换的问题是操作的模糊性(即显式类型转换的点(1)).
C++演员避免这种情况.另外,C++强制转换在搜索时更加明显.
使用Stroustrup的话(static_cast有什么用?):
如果在开发或维护过程中,其中一种类型发生了变化,即使看起来无辜的演员也会成为一个严重的问题.例如,这是什么意思?:
Run Code Online (Sandbox Code Playgroud)x = (T)y;我们不知道.这取决于
Tx和y 的类型和类型.T可以是类,atypedef或模板参数的名称.也许x和y是标量变量,(T)代表价值的转换.也许x是一个派生自y班级的班级,(T)是一个沮丧的人.也许x和y不相关的指针类型.因为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 次 |
| 最近记录: |