如您所知,在一般情况下,理论上不能安全地将 an 转换unsigned long int
为 an 。int
但是,在整数不太大的许多实际案例中确实可以这样做。
我可能会定义和使用这个:
struct Exc_out_of_range {};
int make_int(const unsigned long int a) {
const int n = static_cast<int>(a);
const unsigned long int a2 = static_cast<unsigned long int>(n);
if (a2 != a) throw Exc_out_of_range();
return n;
}
使用<limits>
标头的等效解决方案自然是可能的,但我不知道它是否比上述更好。(如果代码处于时间关键的循环中并且可移植性不是一个因素,那么您可以在汇编中对其进行编码,直接测试感兴趣的位或位,但除非作为汇编语言的练习,否则这将是一个麻烦。)
关于性能,值得注意的是 - 除非您的编译器非常旧 -throw
除非使用,否则不会施加运行时负担。
@GManNickG 添加了从std::exception
. 我个人对此并没有强烈的感觉,但建议是有根据的和赞赏的,我认为没有理由不遵循它。 您可以在此处阅读有关此类继承的更多信息。