Ich bin auf der Suche nach einer Standardbibliothek oder Boost-Funktion, die verlustfrei eine Nummer in einen anderen primitiven Typ umwandeln kann und mich irgendwie darüber informiert, ob die Besetzung verlustfrei war (oder eine Ausnahme auslöst). Hier sind einige Beispiele:Bietet Boost oder die Standardbibliothek eine Möglichkeit, zu überprüfen, ob ein Cast verlustfrei ist?
auto x = lossless_cast<double>(1u); // ok, double can represent 1
auto x = lossless_cast<int>(1.2); // fail, int can't represent 1.2
auto x = lossless_cast<int>(1E200); // fail, int can't represent 1E200
boost::numeric_cast
in der Nähe kommt, dass es Abgüsse abholen, die aus dem numerischen Bereich des Zieltyps fallen, aber nicht, wenn sie lossless, aber innerhalb der Zieltyp (siehe meine 2. Beispiel).
Es gibt eine SO question for the C language which provides some hand-rolled solutions to this problem, aber ich bin nach einer boost
oder Standard Library-Lösung grundsätzlich mit folgenden Funktionen:
template <typename out, typename in>
out lossless_cast(in in_value)
{
out out_value = static_cast<out>(in_value);
if (static_cast<in>(out_value) != in_value)
throw; // some exception
return out_value;
}
Existiert diese Funktionalität?
Schreiben Sie eine Funktion, die den Cast ausführt, und vergleichen Sie Vorher und Nachher für die Gleichheit. –
Wenn Sie eine Lösung ohne Guss-Roundtrips erwarten, könnte dies ein schwierigeres Problem sein, als Sie feststellen. Ein 'float' kann zum Beispiel nicht 16.777.217 darstellen. – zneak
@IgorTandetnik: keine gute Idee - in einigen Fällen gibt das * undefined Verhalten * (z. B. für die 'Lossless_cast (1E200);' Fall in der Frage). –