Funktionsprüfung, ob ein Integer-Typ zu einem Wert eines möglicherweise anderen (Integer-) Typs passen kann

Ist es möglich, eine Vorlagenfunktion zu erstellen, die prüft, ob ein primitiver Datentyp zu einem Wert mit möglicherweise unterschiedlichem primitivem Datentyp passt? Beschränken wir den Gültigkeitsbereich zunächst auf ganzzahlige Typen.

Genauer gesagt: Ist es möglich, eine "One-Fit-All" -Templated-Funktion zu erstellen, ohne Compiler-Warnungen zu erhalten (boolescher Ausdruck immer wahr / falsch, Vergleich mit Vorzeichen / ohne Vorzeichen, nicht verwendete Variable) und ohne die Compiler-Warnungsprüfungen zu deaktivieren? Die Funktionen sollten auch die Überprüfungen zur Laufzeit so weit wie möglich einschränken (alle trivialen Fälle sollten zur Kompilierungszeit ausgeschlossen werden). Ich würde es nach Möglichkeit vorziehen, keine Erweiterungen aus C ++ 11 und dergleichen zu verwenden (es sei denn, es gibt einen "schnellen" Ersatz für "altes" C ++).

Hinweis: "value" ist zur Kompilierungszeit nicht bekannt, nur sein Typ.

Beispiel für erwartetes Verhalten:

int main(int argc, char** argv) {
    for (int i = 1; i < argc; i++) {
        const int value = atoi(argv[i]);
        std::cout << value << ": ";
        std::cout << CanTypeFitValue<int8_t>(value) << " ";
        std::cout << CanTypeFitValue<uint8_t>(value) << " ";
        std::cout << CanTypeFitValue<int16_t>(value) << " ";
        std::cout << CanTypeFitValue<uint16_t>(value) << " ";
        std::cout << CanTypeFitValue<int32_t>(value) << " ";
        std::cout << CanTypeFitValue<uint32_t>(value) << " ";
        std::cout << CanTypeFitValue<int64_t>(value) << " ";
        std::cout << CanTypeFitValue<uint64_t>(value) << std::endl;
        }

}



./a.out 6 1203032847 2394857 -13423 9324 -192992929

6: 1 1 1 1 1 1 1 1

1203032847: 0 0 0 0 1 1 1 1

2394857: 0 0 0 0 1 1 1 1

-13423: 0 0 1 0 1 0 1 0

9324: 0 0 1 1 1 1 1 1

-192992929: 0 0 0 0 1 0 1 0

Testen Sie Ihren CodeHier oderHier.

Überprüfen Sie die generierte BaugruppeHier.

Diese Frage wurde inspiriert vondieser Beitrag

Antworten auf die Frage(6)

Ihre Antwort auf die Frage