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)?
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.
Tags und Links c++ c++11 template-meta-programming metaprogramming integer-overflow