Heim > Backend-Entwicklung > C++ > Warum kann ich Floats nicht als Nicht-Typ-Vorlagenparameter in C verwenden?

Warum kann ich Floats nicht als Nicht-Typ-Vorlagenparameter in C verwenden?

Linda Hamilton
Freigeben: 2024-12-21 15:49:09
Original
740 Leute haben es durchsucht

Why Can't I Use Floats as Non-Type Template Parameters in C  ?

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
}
Nach dem Login kopieren

Fehlermeldung:

'float' is not a valid type for a template constant parameter
Invalid type in declaration before ';' token
Nach dem Login kopieren

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>();
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage