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
Linda HamiltonOriginal
2024-12-21 15:49:09742Durchsuche

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
}

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!

Stellungnahme:
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