2

入力が有効かどうかをチェックする複数の関数を作成する必要があります。ここに私のコードのいくつかがあります:

bool IsValidRange(signed char s)
{
    bool isValid = true;
    if (!((s>=SCHAR_MIN)&&(s<=SCHAR_MAX)))
    {
        isValid = false;
    }
    return isValid;
}

bool IsValidRange(int s)
{
    bool isValid = true;
    if (!((s>=INT_MIN)&&(s<=INT_MAX)))
    {
        isValid = false;
    }
    return isValid;
}

これには、ヘッダー limits.h を使用しています。私はこれを正しい方法でやっていますか?あくまでも初心者ですのでご了承ください。皆様のご理解を賜りますようお願い申し上げます。ありがとうございました!

4

5 に答える 5

6

上記のテンプレートは、float に加えて、signed 型と unsigned 型が混在する場合には機能しません。

template<typename RangeType, typename ValueType >
bool IsInRange( ValueType value ) 
{
    if( ! numeric_limits<RangeType>::is_integer )
    {
        return  (value > 0 ? value  : -value) <= numeric_limits<RangeType>::max(); 
    }

    if ( numeric_limits<RangeType>::is_signed == 
         numeric_limits<ValueType>::is_signed )
    {
        return value >= numeric_limits<RangeType>::min() &&
               value <= numeric_limits<RangeType>::max();
    }
    else if( numeric_limits<RangeType>::is_signed )
    {
        return value <= numeric_limits<RangeType>::max();
    }
    else
    {
        return value >= 0 && value <=  numeric_limits<RangeType>::max();
    }
}
于 2015-02-17T22:38:29.750 に答える
2

まず、ブール値を使用したこれらすべての畳み込みは必要ありません。式を直接返すだけです:

return (s >= SCHAR_MIN) && (s <= SCHAR_MAX);

次に、両方の関数が常に yield であることを認識する必要がありますtrue。定義により、 asigned charは常に range 内[SCHAR_MIN, SCHAR_MAX]にあり、 anintは常に range 内にあります[INT_MIN, INT_MAX]

しかし、別の境界を選択した場合、これは確かにそれを行う方法です (私の最初の発言を考慮して)。

EdSとして。提案されているように、テンプレート化されたソリューションを使用して、必要な関数/オーバーロードの数を減らすことができます:

template<class T>
bool check_range(T value, T min, T max) {
    return (value >= min) && (value <= max);
}
于 2013-09-05T00:40:59.197 に答える