teilweise Spezialisierung von Funktionsvorlagen

8

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.

    
joshu 15.02.2011, 10:40
quelle

5 Antworten

6
___ answer5002655 ___

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.

    
___ antwort5009594 ___

Schreiben Sie eine Typ-Traits-Klasse für Ihre Bedingung:

%Vor%

Verwenden Sie boost :: enable_if und disable_if:

%Vor%     
___ antwort5002768 ___

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.

    
___ answer5002716 ___

Sie können das Überladen von Funktionen mit Vorlagen kombinieren. Also:

%Vor%     
___ tag123c ___ C ++ ist eine universelle Programmiersprache. Es wurde ursprünglich als Erweiterung von C entworfen und behält eine ähnliche Syntax, ist aber jetzt eine komplett andere Sprache. Verwenden Sie dieses Tag für Fragen zu Code, der mit einem C ++ - Compiler kompiliert werden soll. ___ answer18302941 ___

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:

  1. 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

  2. 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%

  3. verwenden

Live-Beispiel

    
___ tag123templatespezialisierung ___ Template-Spezialisierung bezieht sich auf vom Programmierer generierte explizite Spezialisierung von Templates für bestimmte Typen. ___ qstnhdr ___ teilweise Spezialisierung von Funktionsvorlagen ___ tag123functiontemplates ___ Eine Funktionsvorlage verhält sich wie eine reguläre Funktion, außer dass sie mit Typen arbeitet, die in den Vorlagenargumenten angegeben sind. Die Vorlagenargumente könnten Teil der Funktionsargumente und / oder des Funktionskörpers sein. Jede eindeutige Kombination von Vorlagenargumenten wird zu einer eindeutigen Funktion, wenn sie instanziiert wird. ___ tag123templates ___ Das Templates-Tag wird in mehreren Kontexten verwendet: generische Programmierung (insbesondere C ++) und Daten- / Dokumentgenerierung mithilfe von Template-Engines. ___ qstntxt ___

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.

    
___
Fred Nurk 15.02.2011, 21:16
quelle
12

Sie können das Überladen von Funktionen mit Vorlagen kombinieren. Also:

%Vor%     
Gavin Lock 15.02.2011 10:51
quelle
5

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() :

%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.

    
quelle
3
___ answer5002655 ___

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.

    
___ antwort5009594 ___

Schreiben Sie eine Typ-Traits-Klasse für Ihre Bedingung:

%Vor%

Verwenden Sie boost :: enable_if und disable_if:

%Vor%     
___ antwort5002768 ___

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.

    
___ answer5002716 ___

Sie können das Überladen von Funktionen mit Vorlagen kombinieren. Also:

%Vor%     
___ tag123c ___ C ++ ist eine universelle Programmiersprache. Es wurde ursprünglich als Erweiterung von C entworfen und behält eine ähnliche Syntax, ist aber jetzt eine komplett andere Sprache. Verwenden Sie dieses Tag für Fragen zu Code, der mit einem C ++ - Compiler kompiliert werden soll. ___ answer18302941 ___

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:

  1. 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

  2. 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%

  3. verwenden

Live-Beispiel

    
___ tag123templatespezialisierung ___ Template-Spezialisierung bezieht sich auf vom Programmierer generierte explizite Spezialisierung von Templates für bestimmte Typen. ___ qstnhdr ___ teilweise Spezialisierung von Funktionsvorlagen ___ tag123functiontemplates ___ Eine Funktionsvorlage verhält sich wie eine reguläre Funktion, außer dass sie mit Typen arbeitet, die in den Vorlagenargumenten angegeben sind. Die Vorlagenargumente könnten Teil der Funktionsargumente und / oder des Funktionskörpers sein. Jede eindeutige Kombination von Vorlagenargumenten wird zu einer eindeutigen Funktion, wenn sie instanziiert wird. ___ tag123templates ___ Das Templates-Tag wird in mehreren Kontexten verwendet: generische Programmierung (insbesondere C ++) und Daten- / Dokumentgenerierung mithilfe von Template-Engines. ___ qstntxt ___

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.

    
___
BЈовић 15.02.2011 10:56
quelle
0

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:

  1. 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

  2. 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

  3. verwenden

Live-Beispiel

    
RiaD 18.08.2013 19:35
quelle