Einschränkungen von Vorlagenparametern verstehen: Warum Float-Werte verboten sind
In C gelten beim Definieren einer generischen Klasse mit Vorlagenparametern bestimmte Einschränkungen. Eine dieser Einschränkungen besteht darin, dass Float-Werte nicht als nicht typbasierte Vorlagenparameter verwendet werden können. Dies wird deutlich, wenn Sie versuchen, Code wie den folgenden zu kompilieren:
template <class T, T defaultValue> class GenericClass { // ... }; int main() { GenericClass<float, 4.6f> gcFloat; // Error }
Fehlermeldung:
'float' is not a valid type for a template constant parameter Invalid type in declaration before ';' token
Begründung:
Gemäß dem C 11-Standard müssen Nicht-Typ-Vorlagenargumente bestimmten Anforderungen entsprechen. Für typfremde Vorlagenparameter vom Typ Integral oder Aufzählung sind nur konvertierte konstante Ausdrücke desselben Typs zulässig. Float-Werte erfüllen diese Anforderung nicht, da sie nicht exakt im Speicher dargestellt werden können.
Technische Erklärung:
Die Verwendung von Float-Werten als Vorlagenargumente könnte zu inkonsistentem Verhalten führen. Betrachten Sie beispielsweise Folgendes:
func<1/3.f>(); func<2/6.f>();
Auch wenn wir beabsichtigten, dieselbe Funktion zweimal aufzurufen, ist die Gleitkommadarstellung der beiden Berechnungen möglicherweise nicht identisch. Dies könnte zu unterschiedlichen Ergebnissen führen und den Zweck der Verwendung von Vorlagenargumenten zunichte machen.
Alternativer Ansatz:
Um Gleitkommawerte als Vorlagenargumente darzustellen, sollten Sie die Verwendung von C 11 in Betracht ziehen Konstante Ausdrücke (constexpr). Sie können erweiterte Ausdrücke erstellen, die den Zähler und Nenner eines Gleitkommawerts zur Kompilierzeit berechnen und sie als separate Ganzzahlargumente übergeben. Definieren Sie außerdem einen Schwellenwert, um sicherzustellen, dass nahe beieinander liegende Gleitkommawerte denselben Zähler und Nenner ergeben.
Das obige ist der detaillierte Inhalt vonWarum kann ich Floats nicht als Nicht-Typ-Vorlagenparameter in C verwenden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!