指定した範囲のみを保持するクラス


こんな感じの事がしたい。

// 保持出来る範囲を指定して定義
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