只需使用static_cast
. C 类型转换的问题在于操作的模糊性(即显式类型转换的第 (1) 点)。
C++ 强制转换避免了这种情况。此外,在搜索它们时,C++ 强制转换更加明显。
用 Stroustrup 的话(static_cast 有什么用?):
如果在开发或维护期间,所涉及的类型之一发生了变化,即使是看起来很无辜的演员表也可能成为一个严重的问题。例如,这是什么意思?:
x = (T)y;
我们不知道。这取决于T
x 和 y 的类型和类型。T
可以是类名、atypedef
或模板参数。也许x
和y
是标量变量,(T)
表示值转换。Maybex
是从y
's 类派生的类,并且(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
转换数字类型时检测范围丢失,如果无法保留范围则抛出异常。