Metafunktion, um x ^ n zu berechnen und den ganzzahligen Grenzwert ohne Überlauf zurückzugeben, wenn dies nicht möglich ist?

7

Betrachten Sie den folgenden Code:

%Vor%

Anstelle von /* something */ möchte ich std::numeric_limits<std::intmax_t>::min() oder std::numeric_limits<std::intmax_t>::max() zurückgeben, wenn Base^Exponent nicht durch std::intmax_t dargestellt werden kann. Die Schwierigkeit besteht darin, Überläufe während der Berechnung zu vermeiden, da sie bei der Kompilierung Fehler verursachen.

Wie geht das (ohne Boost)?

    
Vincent 09.11.2013, 13:46
quelle

1 Antwort

18

Eine Version basierend auf SFINAE:

%Vor%

Anwendungsbeispiel:

%Vor%

Ausgabe:

%Vor%

Erläuterung:

Ein konstanter Ausdruck darf kein undefiniertes Verhalten [expr.const] / 2:

enthalten
  
  • eine Operation mit undefiniertem Verhalten [ Hinweis: einschließlich z. B. vorzeichenbehafteter Integer-Überlauf, bestimmter Zeigerarithmetik, Division durch Null oder bestimmte Schiebeoperationen   - Endnote ];
  •   

Immer dann, wenn unbounded integer_power einen Überlauf erzeugt, ist der Ausdruck, der verwendet wird, um std::integral_constant zu deklarieren, kein gültiger konstanter Ausdruck. Substitution fehlschlägt und die Fallback-Funktion wird verwendet.

    
dyp 09.11.2013, 14:22
quelle