ご存知のように、一般的なケースでは、理論上安全に を に変換することはできませunsigned long int
ん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
ます。私は個人的にこれについて強い感情を持っていませんが、アドバイスは十分に根拠があり、高く評価されており、従わない理由はほとんどないと思います. このような継承の詳細については、こちらを参照してください。