Schreiben Sie eine Typ-Traits-Klasse für Ihre Bedingung:
%Vor%Verwenden Sie boost :: enable_if und disable_if:
%Vor%Im folgenden Code-Snippet
%Vor%Ich möchte die Templates modifizieren lassen, die durch Übergeben eines anderen Typs als float "all" und passendes float "float" drucken. Ich möchte keine Template-Spezialisierung, sondern partielle Spezialisierung, die entsprechend dem Eingabetyp entsprechend agiert. Wie soll ich vorgehen? Vielen Dank im Voraus.
Nun, das Szenario, dem ich momentan gegenüberstehe, ist Ich muss Folgendes definiert haben,
%Vor%Die folgenden Anrufe sollten "t2"
drucken %Vor%Die folgenden Anrufe sollten "t1"
drucken %Vor%eine Art Gruppierung wie oben, wo wenige die partielle Spezialisierung nennen sollten und andere die Standardimplementierung aufrufen sollten.
Sie können Funktionen in C ++ nicht teilweise spezialisieren.
Vielleicht ist das nicht die Terminologie, die Sie meinen. Sie können Vorlagen wie %code% verwenden, um bedingte Logik basierend auf dem angegebenen Vorlagenparameter auszuführen. Sie können %code% auch an einem anderen Ort verwenden, an dem Sie einen anderen Typ verwenden möchten, z. B. in %code% :
%Vor%(Obwohl ich nicht empfehlen würde, typeid (). name () zu verwenden, da sein Wert nicht vom Standard angegeben wird und von dem in Ihrem Code geschriebenen Typ, zu einem verstümmelten Symbol oder dem Text zu abweichen kann Pokerface .)
Addendum Wie andere Beantworter würde ich persönlich die Template-Spezialisierung selbst wählen oder einfach die Funktion overloading übernehmen. Ich weiß nicht, warum du ihnen abgeneigt bist, aber dafür sind sie da.
Schreiben Sie eine Typ-Traits-Klasse für Ihre Bedingung:
%Vor%Verwenden Sie boost :: enable_if und disable_if:
%Vor%Wie Tomalak bereits in seiner Antwort gesagt hat, können Sie eine Template-Funktion nicht teilweise spezialisieren, aber wenn Sie Ihre Funktion als statische Member-Funktion in einer Template-Klasse ändern, könnten Sie das tun.
Ein besserer Ansatz wäre jedoch das Überladen von Funktionen.
Sie können das Überladen von Funktionen mit Vorlagen kombinieren. Also:
%Vor%So funktioniert es ohne hässliche Syntax %code% für %code% im Falle einer beliebigen Anzahl von Bedingungen.
Wenn wir wissen, dass die Teilspezialisierung nicht mit der Arbeitsfunktion arbeitet, sondern mit Klassen arbeitet, verwenden wir Klassen! Wir sollten es vor Leuten verstecken, aber wir können sie benutzen!
OK, Code:
%Vor% (1) Zuallererst nur für jeden Typ Call-Helfer. Keine Spezialisierung für Funktionen.
(2) Hier fügen wir ein Dummy-Argument hinzu. Wir müssen es beim Aufruf nicht angeben, da es standardmäßig auf %code% gesetzt ist.
(3) In 3 geben wir nur %code% an, wenn wir %code% und alles andere erlauben (oder SFINAE wie in unserem Fall). Eine wichtige Sache ist, dass wir einige %code% nicht zweimal oder mehr zulassen sollten.
Anmerkungen:
Wir können den Standardtyp auch in std :: true_type ändern, danach können wir %code% loswerden ( %code% wird nur in %code% geändert). Ich bin mir nicht sicher was
Dieser Code verwendet Typmerkmale aus C ++ 11. Wenn Sie keine C ++ 11-Unterstützung haben, können Sie eigene Merkmale schreiben oder Typmerkmale aus %code%
Im folgenden Code-Snippet
%Vor%Ich möchte die Templates modifizieren lassen, die durch Übergeben eines anderen Typs als float "all" und passendes float "float" drucken. Ich möchte keine Template-Spezialisierung, sondern partielle Spezialisierung, die entsprechend dem Eingabetyp entsprechend agiert. Wie soll ich vorgehen? Vielen Dank im Voraus.
Nun, das Szenario, dem ich momentan gegenüberstehe, ist Ich muss Folgendes definiert haben,
%Vor%Die folgenden Anrufe sollten "t2"
drucken %Vor%Die folgenden Anrufe sollten "t1"
drucken %Vor%eine Art Gruppierung wie oben, wo wenige die partielle Spezialisierung nennen sollten und andere die Standardimplementierung aufrufen sollten.
Sie können das Überladen von Funktionen mit Vorlagen kombinieren. Also:
%Vor%Sie können Funktionen in C ++ nicht teilweise spezialisieren.
Vielleicht ist das nicht die Terminologie, die Sie meinen. Sie können Vorlagen wie boost::is_same<T1, T2>
verwenden, um bedingte Logik basierend auf dem angegebenen Vorlagenparameter auszuführen. Sie können T
auch an einem anderen Ort verwenden, an dem Sie einen anderen Typ verwenden möchten, z. B. in typeid(T).name()
:
(Obwohl ich nicht empfehlen würde, typeid (). name () zu verwenden, da sein Wert nicht vom Standard angegeben wird und von dem in Ihrem Code geschriebenen Typ, zu einem verstümmelten Symbol oder dem Text zu abweichen kann Pokerface .)
Addendum Wie andere Beantworter würde ich persönlich die Template-Spezialisierung selbst wählen oder einfach die Funktion overloading übernehmen. Ich weiß nicht, warum du ihnen abgeneigt bist, aber dafür sind sie da.
Sie können Funktionen in C ++ nicht teilweise spezialisieren.
Vielleicht ist das nicht die Terminologie, die Sie meinen. Sie können Vorlagen wie %code% verwenden, um bedingte Logik basierend auf dem angegebenen Vorlagenparameter auszuführen. Sie können %code% auch an einem anderen Ort verwenden, an dem Sie einen anderen Typ verwenden möchten, z. B. in %code% :
%Vor%(Obwohl ich nicht empfehlen würde, typeid (). name () zu verwenden, da sein Wert nicht vom Standard angegeben wird und von dem in Ihrem Code geschriebenen Typ, zu einem verstümmelten Symbol oder dem Text zu abweichen kann Pokerface .)
Addendum Wie andere Beantworter würde ich persönlich die Template-Spezialisierung selbst wählen oder einfach die Funktion overloading übernehmen. Ich weiß nicht, warum du ihnen abgeneigt bist, aber dafür sind sie da.
Schreiben Sie eine Typ-Traits-Klasse für Ihre Bedingung:
%Vor%Verwenden Sie boost :: enable_if und disable_if:
%Vor%Wie Tomalak bereits in seiner Antwort gesagt hat, können Sie eine Template-Funktion nicht teilweise spezialisieren, aber wenn Sie Ihre Funktion als statische Member-Funktion in einer Template-Klasse ändern, könnten Sie das tun.
Ein besserer Ansatz wäre jedoch das Überladen von Funktionen.
Sie können das Überladen von Funktionen mit Vorlagen kombinieren. Also:
%Vor%So funktioniert es ohne hässliche Syntax %code% für %code% im Falle einer beliebigen Anzahl von Bedingungen.
Wenn wir wissen, dass die Teilspezialisierung nicht mit der Arbeitsfunktion arbeitet, sondern mit Klassen arbeitet, verwenden wir Klassen! Wir sollten es vor Leuten verstecken, aber wir können sie benutzen!
OK, Code:
%Vor% (1) Zuallererst nur für jeden Typ Call-Helfer. Keine Spezialisierung für Funktionen.
(2) Hier fügen wir ein Dummy-Argument hinzu. Wir müssen es beim Aufruf nicht angeben, da es standardmäßig auf %code% gesetzt ist.
(3) In 3 geben wir nur %code% an, wenn wir %code% und alles andere erlauben (oder SFINAE wie in unserem Fall). Eine wichtige Sache ist, dass wir einige %code% nicht zweimal oder mehr zulassen sollten.
Anmerkungen:
Wir können den Standardtyp auch in std :: true_type ändern, danach können wir %code% loswerden ( %code% wird nur in %code% geändert). Ich bin mir nicht sicher was
Dieser Code verwendet Typmerkmale aus C ++ 11. Wenn Sie keine C ++ 11-Unterstützung haben, können Sie eigene Merkmale schreiben oder Typmerkmale aus %code%
Im folgenden Code-Snippet
%Vor%Ich möchte die Templates modifizieren lassen, die durch Übergeben eines anderen Typs als float "all" und passendes float "float" drucken. Ich möchte keine Template-Spezialisierung, sondern partielle Spezialisierung, die entsprechend dem Eingabetyp entsprechend agiert. Wie soll ich vorgehen? Vielen Dank im Voraus.
Nun, das Szenario, dem ich momentan gegenüberstehe, ist Ich muss Folgendes definiert haben,
%Vor%Die folgenden Anrufe sollten "t2"
drucken %Vor%Die folgenden Anrufe sollten "t1"
drucken %Vor%eine Art Gruppierung wie oben, wo wenige die partielle Spezialisierung nennen sollten und andere die Standardimplementierung aufrufen sollten.
So funktioniert es ohne hässliche Syntax a and !b and !c
für enable_if
im Falle einer beliebigen Anzahl von Bedingungen.
Wenn wir wissen, dass die Teilspezialisierung nicht mit der Arbeitsfunktion arbeitet, sondern mit Klassen arbeitet, verwenden wir Klassen! Wir sollten es vor Leuten verstecken, aber wir können sie benutzen!
OK, Code:
%Vor% (1) Zuallererst nur für jeden Typ Call-Helfer. Keine Spezialisierung für Funktionen.
(2) Hier fügen wir ein Dummy-Argument hinzu. Wir müssen es beim Aufruf nicht angeben, da es standardmäßig auf void
gesetzt ist.
(3) In 3 geben wir nur void
an, wenn wir T
und alles andere erlauben (oder SFINAE wie in unserem Fall). Eine wichtige Sache ist, dass wir einige T
nicht zweimal oder mehr zulassen sollten.
Anmerkungen:
Wir können den Standardtyp auch in std :: true_type ändern, danach können wir std::enable_if
loswerden ( std::enable_if<some_trait<T>::value>
wird nur in some_trait<T>::type
geändert). Ich bin mir nicht sicher was
Dieser Code verwendet Typmerkmale aus C ++ 11. Wenn Sie keine C ++ 11-Unterstützung haben, können Sie eigene Merkmale schreiben oder Typmerkmale aus boost
Tags und Links c++ templates template-specialization function-templates