Ada、Pascal、および他の多くの言語は、整数をサブタイプする方法である範囲をサポートしています。範囲は、値 (最初) から別の値 (最後) までの範囲の符号付き整数値です。OOP で同じことを行うクラスを実装するのは簡単ですが、この機能をネイティブにサポートすることで、コンパイラが追加の静的チェックを実行できるようになると思います。
範囲内で定義された変数が実行時に「オーバーフロー」しないことを静的に検証することは不可能であることはわかっています。より一般的なソリューションを提供する Design by Contract アプローチ (Eiffel) と Spec# (C# Contracts )について考えます。
C++、C#、および Java でコンパイル時に少なくとも静的な範囲外の割り当てをチェックする、より簡単なソリューションはありますか? ある種のstatic-assert ?
編集:「範囲」はさまざまな目的に使用できることを理解しています:
- イテレータ
- 列挙子
- 整数サブタイプ
前者は C* 言語で簡単にマッピングできるため、後者に焦点を当てます。音楽の音量のような値の閉じたセット、つまり 1 から 100 までの範囲について考えます。値を増減したいと思います。次のような静的オーバーフローの場合にコンパイルエラーが発生するようにしたいと思います。
volume=rangeInt(0,100);
volume=101; // compile error!
volume=getIntFromInput(); // possible runtime exception
ありがとう。