2017-02-09 18 views
-1

Hereは、私が見つけることができる最も近い複製です。より小さい数値型にキャストする前に範囲チェックを実行する安全でクロスプラットフォームな方法は何ですか?

タグにもかかわらず、質問はCのようであり、使用可能なanswerはC99仕様を参照しています。

Boostや他のライブラリを使用せずに、このチェックをC++ 98で処理する正しい方法は何ですか?

+0

を::狭い()'、そこにISNそれほど大したことはない。 –

+0

['std :: numeric_limits'](http://en.cppreference.com/w/cpp/types/numeric_limits) –

答えて

1

あなたはgsl::narrow()からコードをコピーして、わずかにそれを微調整、boolはなくthrow ING返すcan_narrow()にそれを回すことができます。ちょうどGSL `からコードをコピーし

// narrow_cast(): a searchable way to do narrowing casts of values 
template<class T, class U> 
inline constexpr T narrow_cast(U u) noexcept 
{ return static_cast<T>(u); } 

namespace details 
{ 
    template<class T, class U> 
    struct is_same_signedness : public std::integral_constant<bool, std::is_signed<T>::value == std::is_signed<U>::value> 
    {}; 
} 

template<class T, class U> 
inline bool can_narrow(U u) 
{ 
    T t = narrow_cast<T>(u); 
    if (static_cast<U>(t) != u) 
     return false; 
    if (!details::is_same_signedness<T, U>::value && ((t < T{}) != (u < U{}))) 
     return false; 
    return true; 
} 
+0

can_narrowのように見える(2.0001)はfalseを返すでしょうか? –

+0

これは次のようになります。 'double'は' int'より小さいです。 –

+0

"範囲チェック"は、ソースタイプの範囲がターゲットタイプの範囲を超えるかどうかではなく、特定の値_をターゲットタイプに安全に減らすことができるかどうかという疑問です。 'u'が '(std :: numeric_limits :: lowest ()、std :: numeric_limits :: max ())'の範囲内にある限り、範囲チェックはtrueを返しませんか? –

関連する問題