在不同数字类型之间进行投射的最佳做法是什么?类型float
,double
,int
是我在C ++中使用最多的类型。
f
为float
且n
为double
或int
的选项示例:
float f = static_cast<float>(n);
float f = float(n);
float f = (float)n;
我经常写static_cast<T>(...)
,但想知道如果有一种首选方式,C ++开发社区是否有任何共识。
我很欣赏这可能最终成为一个基于意见的问题而且可能没有&#34;标准&#34;方式,在这种情况下,请让我知道没有标准的方式,所以至少我知道: - )
我知道这个问题与一般的投射有关cropped up,但是,我特别关注数字以及数字类型方法中是否有特定的最佳实践。
答案 0 :(得分:6)
只需使用static_cast
即可。 C强制转换的问题是操作的模糊性(即Explicit type conversion的点(1))。
C ++演员避免这种情况。另外,C ++强制转换在搜索时更加明显。
使用Stroustrup的单词(What good is static_cast?):
如果在开发或维护过程中,其中一种类型发生了变化,即使看起来无辜的演员也会成为一个严重的问题。例如,这是什么意思?:
x = (T)y;
我们不知道。它取决于类型
T
以及x和y的类型。T
可以是类的名称,typedef
或模板参数。可能x
和y
是标量变量,(T)
代表值转换。也许x
属于从y
类中派生的类,而(T)
是向下倾斜的类。也许x
和y
是不相关的指针类型。因为C风格的转换(T)
可以用来表达许多逻辑上不同的操作,所以编译器只有最小的机会来捕获误用。出于同样的原因,程序员可能不知道演员的具体内容。这有时被新手程序员认为是一种优势,并且在新手猜错时是一个微妙错误的来源。&#34;新式演员&#34;介绍是为了让程序员有机会更清楚地陈述他们的意图,并让编译器捕获更多的错误。
[CUT]
引入新式演员阵容的第二个原因是C风格的演员阵容很难在节目中发现。例如,您无法使用普通编辑器或文字处理器方便地搜索演员表。
[CUT]
在现代C ++中,强制转换实际上是可以避免的
另请考虑boost::numeric::converter
/ boost::numeric_cast
更安全的替代方案(Boost.NumericConversion库的一部分)。
E.g。
#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;
}
一般来说,对于隐式转换和显式转换(通过static_cast
),缺少范围保留会导致数字类型之间的转换容易出错。
numeric_cast
检测到范围丢失,如果无法保留范围,则抛出异常。
答案 1 :(得分:-1)
一般来说,这些铸造运营商分为两大类: 特定的铸造运营商和传统的铸造运营商。 cplusplus.com解释如下:
...为了控制类之间的这些类型的转换,我们有四个特定的转换操作符:dynamic_cast,reinterpret_cast,static_cast和const_cast。它们的格式是遵循括号(&lt;&gt;)和紧跟在括号之间转换的表达式之间的新类型。
dynamic_cast <new_type> (expression)
reinterpret_cast <new_type> (expression)
static_cast <new_type> (expression)
const_cast <new_type> (expression)
这些表达式的传统类型转换等价物是:
(new_type) expression
new_type (expression)
但每一个都有自己的特色。
在处理任务时,我们(几乎)都使用特定投射。在考虑了建议之后,这取决于你。
请参阅resource。