指定した範囲のみを保持するクラス
こんな感じの事がしたい。
// 保持出来る範囲を指定して定義 hoge<int, 0, 20> value = 10; value = 0; value = 20; value = 21; // 範囲外なのでエラー
boost に見当たらなかったのでガシガシ書いてみた。
どこかに存在しそうですが・・・。
#include <assert.h> #include <boost/integer.hpp> #include <boost/static_assert.hpp> template< typename T, T min = boost::integer_traits<T>::const_min, T max = boost::integer_traits<T>::const_max > struct limitation_value{ BOOST_STATIC_ASSERT(min < max); typedef T value_t; static const value_t min_value = min; static const value_t max_value = max; limitation_value(const value_t& rhs){ assign(rhs); } const limitation_value& operator =(const limitation_value& rhs){ assign(static_cast<T>(rhs)); return *this; } operator T(){ return value; } operator const T()const{ return value; } private: void assign(const value_t& rhs){ assert( (min_value <= rhs) && (rhs <= max_value) ); value = rhs; } value_t value; }; int main(){ // 保持する値の範囲を指定して定義 limitation_value<int, 0, 20> value(5); value = 10; // 0〜20の範囲なら代入可能 int hoge = 7; value = hoge; // 保持する型と同じなら代入可能 // value = 21; // 範囲外なので実行時エラー // 大文字のみ保持する char 型 limitation_value<char, 'A', 'Z'> upper_case = 'G'; // upper_case = 'g'; // 小文字なので実行時エラー // float は template の定数に設定出来ないのでエラー // limitation_value<float, 0.0f, 10.0f> float_value; return 0; }
保持する値の最小値と最大値を指定して定義を行い、範囲外の値が代入されたときに実行時エラーにします。
実行時エラーじゃなくて、例外を飛ばしたりしてもいいかもしれない。
[追記]
Boost.ConstrainedValue なるものがレビュー中(?)みたいです。
将来的には、boost に導入される可能性があるかも知れませんが、現状ではないみたいですね。
詳細はこちらで。
ってか、どこかで見たような気がしたのはここだったか。
コメントありがとうございます。
[boost]
ver 1.44.0