C++ Template für die sichere integer CASTET

Ich bin versucht, schreiben Sie ein C++ - template-Funktion, die werfen eine exception zur Laufzeit, die auf integer-überlauf in Besetzungen zwischen verschiedenen integralen Typen, mit unterschiedlichen breiten, und möglich signed/unsigned mismatch. Für diese Zwecke bin ich nicht besorgt mit der Umwandlung von Fließkomma-Typen zu integralen Typen, noch von anderen Objekt-zu-Objekt-Konvertierungen. Ich möchte dies tun, ohne zu schreiben, viel Sonderfall-code. Dies ist, was ich derzeit habe:

template< typename T, typename R > void safe_cast( const T& source, R& result )
{
    //get the maximum safe value of type R
    R rMax = (R) ~0;
    if ( rMax < 0 ) //R is a signed type
    {
        //assume that we're on an 8-bit twos-compliment machine
        rMax = ~( 0x80 << ( ( sizeof( R ) - 1 ) * 8 ) );
    }

    if ( ( source & rMax  ) != source )
    {
        throw new IntegerOverflowException( source );
    }

    result = static_cast<R>( source );
}

Ist dies richtig und effizient?

EDIT: aus verschiedenen Gründen stl ist nicht verfügbar, also ich kann nicht mit std::numeric_limits, und alles, was von Boost ist raus.

  • Aber Sie könnten kopieren Sie den code brauchst du von numeric_limits in Ihre eigenen Vorlagen Helfer. Ordnen Sie alles zu uint64 (oder was auch immer die maximal zulässige Größe ist) und Vergleiche dazu in diesem Typ.
  • Das funktioniert vielleicht, aber man muss wirklich bewusst sein, die Lizenzbedingungen, die beim kopieren von code wie dieser. Neben potenziell Verletzung der Bedingungen, könnte man versehentlich "infizieren" Ihr code, wie ist der Fall mit der GPL. Stellen Sie sicher, dass die Lizenzen kompatibel sind, bevor Sie diese Art der Sache. Die üblichen "ich bin kein Jurist" Haftungsausschluss gilt.
  • Was sind die verschiedenen Gründe, die Sie nicht verwenden können die STL?
InformationsquelleAutor JSBձոգչ | 2009-06-15
Schreibe einen Kommentar