Angenommen, dass ich eine Funktionsschablone benötige, die verschiedene Beträge von Bitverschiebungen auf verschiedenen Integertypen durchführt. Beispiel: Wenn der Eingangswert n
vom Typ char
ist, führt die Funktion einige Berechnungen unter n>>2
und n<<3
durch. Wenn es short int
ist, verwendet die Funktion n>>1
und n<<8
. Für int
geben Sie n>>11
und n<<9
, und so weiter. Natürlich sind die genannten Werte nur beispielhaft und es gibt keine Korrelation zwischen ihnen und der Größe von int_type.Wie man eine Schablone mit kundenspezifischen Bitverschiebungswerten macht
Mein Vorschlag für dieses Problem war so etwas wie diese:
template <typename Num_Type = char, int s1 = 2, int s2 = 3> void test1(Num_Type &n)
{
// this is just an example code:
int a = n >> s1,
b = n << s2;
// do some calculations on a and b
}
So kann ich diese Vorlage für verschiedene Arten von Eingangswert verwenden. Aber wenn ich es kompiliere, gibt es mir mehrere Warnungen über undefiniertes Verhalten in Schichtoperationen, weil der Wert möglicherweise zu groß ist.
Wie kann ich Bit-Schicht-Betrieb ohne „undefiniertes Verhalten“ immer Warnungen anpassen
-
:
Kann ich einen begrenzten Datentyp haben, sagen
intlength
, die nur einen bestimmten Bereich von Zahlen haben kann, sagen0, 1, 2, ... , 31
? Ich weiß, es kann dumm klingen, aber in diesem Fall kann ich die Vorlage alstemplate <typename Num_Type = char, intlength s1 = 2, intlength s2 = 3> void test1(Num_Type &n)
So kann die Frage in zwei Formen gefragt, oder
definieren und damit der Compiler soll nicht über Verschiebungswerte beschweren.
Warum erhalten Sie die Warnungen? Ich meine, warum versuchst du, 'n' mit einem zu großen' s1' oder 's2' zu verschieben? – rozina
@rozina Ich versuche nicht, es mit zu großen Werten zu verschieben, Meine beabsichtigten Werte sind klein, aber da der Verschiebungsbetrag vom Typ int ist, denkt der Compiler, dass es zu groß werden kann –
Ich sehe. Vielleicht ist die Warnung hier nicht sinnvoll und Sie könnten sie für diese Funktion deaktivieren. Und um sicher zu sein, können Sie Behauptungen in den Funktionskörper einfügen, um zu testen, dass "s1" und "s2" nicht zu groß sind. [Clang erzeugt jedoch keine Warnungen] (http://coliru.stacked-crooked.com/a/ad90bdc4aec37f1f) – rozina