Hereは、私が見つけることができる最も近い複製です。より小さい数値型にキャストする前に範囲チェックを実行する安全でクロスプラットフォームな方法は何ですか?
タグにもかかわらず、質問はCのようであり、使用可能なanswerはC99仕様を参照しています。
Boostや他のライブラリを使用せずに、このチェックをC++ 98で処理する正しい方法は何ですか?
Hereは、私が見つけることができる最も近い複製です。より小さい数値型にキャストする前に範囲チェックを実行する安全でクロスプラットフォームな方法は何ですか?
タグにもかかわらず、質問はCのようであり、使用可能なanswerはC99仕様を参照しています。
Boostや他のライブラリを使用せずに、このチェックをC++ 98で処理する正しい方法は何ですか?
あなたは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;
}
can_narrowのように見える
これは次のようになります。 'double'は' int'より小さいです。 –
"範囲チェック"は、ソースタイプの範囲がターゲットタイプの範囲を超えるかどうかではなく、特定の値_をターゲットタイプに安全に減らすことができるかどうかという疑問です。 'u'が '(std :: numeric_limits :: lowest
を::狭い()'、そこにISNそれほど大したことはない。 –
['std :: numeric_limits'](http://en.cppreference.com/w/cpp/types/numeric_limits) –