Существует ли безопасный способ надежно определить, может ли интегральный тип t сохранить целочисленное значение с плавающей точкой f (так что f == Пол (f) ) без какого-либо переполнения? Целое число переполнений - это не определено поведение в C ++. Я заинтересован в решении, которое является правильным в соответствии с текущим стандартом C ++ (C ++ 17 на написании) и избегает не определенного поведения .
Следующий наивный подход не является надежным, поскольку нет гарантии, что тип f может представлять std :: numeric_limits :: max () supating-point> nupe-point-point> wating-point-point>. />
#include
#include
#include
template
bool is_safe_conversion(F x)
{
static_assert(std::is_floating_point_v);
static_assert(std::is_integral_v);
// 'fmax' may have a different value than expected
static constexpr F fmax = static_cast(std::numeric_limits::max());
return std::abs(x)
есть идея? < /p>
Подробнее здесь: https://stackoverflow.com/questions/513 ... conversion