C ++中用于在数字类型之间进行转换的最佳实践
这个问题在这里已经有了答案:
只需使用static_cast
。 C剧本的问题是操作的模糊性(即显式类型转换的点(1))。
C ++强制避免这种情况。 此外,C ++强制转换在搜索时更为明显。
使用Stroustrup的话(static_cast有什么好处?):
如果在开发或维护过程中涉及的其中一种类型发生变化,那么即使是无辜的演员阵容也会成为一个严重的问题。 例如,这是什么意思?:
x = (T)y;
我们不知道。 它取决于类型T
和x和y的类型。 T
可以是一个类的名字,一个typedef
,或者一个模板参数。 也许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;
}
通常,对于隐式转换和显式转换(通过static_cast
),缺少范围保存会使数值类型之间的转换容易出错。
numeric_cast
在转换数字类型时检测范围的丢失,如果范围不能保留,则引发异常。
通常,这些铸造操作员分为两大类: 特定铸造操作员和传统铸造操作员 。 cplusplus.com这样解释它:
...为了控制类之间的这些类型转换,我们有四个特定的转换运算符:dynamic_cast,reinterpret_cast,static_cast和const_cast。 它们的格式是遵循尖括号(<>)和紧随其后的新类型,表达式在括号之间进行转换。
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)
但每一个都有其特殊的特征。
在处理任务时,我们(几乎)都使用特定的投射 。 在考虑这些建议之后,这取决于你。
查看资源。
链接地址: http://www.djcxy.com/p/28695.html