2つのオペランドのプロモートされたタイプを取得するにはどうすればよいですか?
これは、次のようなコードに役立つ場合があります。
template <typename LHS, typename RHS>
bool would_overflow_upon_addition (LHS lhs, RHS rhs) {
return lhs > std::numeric_limits<promoted<LHS,RHS>::type>::max()-rhs;
}
2つのオペランドのプロモートされたタイプを取得するにはどうすればよいですか?
これは、次のようなコードに役立つ場合があります。
template <typename LHS, typename RHS>
bool would_overflow_upon_addition (LHS lhs, RHS rhs) {
return lhs > std::numeric_limits<promoted<LHS,RHS>::type>::max()-rhs;
}
common_type
あなたの答えになるはずです:
#include <type_traits>
typedef std::common_type<LHS, RHS>::type ctype;
これは実際には人が考えるよりも簡単です:
template <typename LHS, typename RHS>
bool would_overflow_upon_addition (LHS lhs, RHS rhs) {
return lhs > std::numeric_limits<decltype(lhs+rhs)>::max()-rhs;
}
decltype(X)
は評価されず、静的タイプのみX
が導出されます*
*したがって、「コンパイル時のオーバーフロー」や「コンパイル時の未定義の動作」は発生しません。