Каков безопасный кроссплатформенный способ проверки диапазона перед приведением к меньшему числовому типу?

Вот самый близкий дубликат, который я мог найти.

Несмотря на теги, вопрос, кажется, о C, и пригодный для использования ответ ссылается на спецификацию C99.

Как правильно обрабатывать эту проверку в C ++ 98, не используя Boost или другие библиотеки?

-1

Решение

Вы можете скопировать код из gsl::narrow() и слегка подправить его, превратив в can_narrow() возвращая bool скорее, чем throwING:

// 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;
}
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]