template-specialization

___ qstnhdr ___ Kann ich eine Template-Spezialisierung aus einer Typliste deklarieren? ___ answer33084394 ___

Ich bin mir ziemlich sicher, dass das ohne den Präprozessor nicht möglich ist. Möglicherweise können Sie das Vorlagenargumentpaket aus einem Argument rekonstruieren, aber Sie müssen eine Instanz des Arguments übergeben, die nicht optimal ist. Zweitens sind explizite Template-Instanziierungen im Blockbereich (d. H. In einer Template-Funktion) nicht erlaubt, so dass es keine Möglichkeit gibt, eine Template zu schreiben, die explizit eine andere Vorlage instanziiert.

Wie Nir angibt, warum verwenden Sie nicht einfach ein X-Makro ?

%Vor%

Aktualisieren Sie jetzt MY_FOREACH_TYPES, wenn sich Ihre Typliste ändert.

    
___ answer33128270 ___

Das würde den Trick machen. Irgendwann mit einer Spezialisierung der Typliste mit nur einem (oder keinem) Typen.

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

Eine Version, um mit einem normalen Präprozessor zu arbeiten

%Vor%     
___ tag123templates ___ Das Templates-Tag wird in mehreren Kontexten verwendet: generische Programmierung (insbesondere C ++) und Daten- / Dokumentgenerierung mithilfe von Template-Engines. ___ qstntxt ___

Ziemlich sicher, ich kenne die Antwort schon, aber es ist einen Versuch wert.

Sagen wir also, ich habe eine Typliste:

%Vor%

Das enthält einige Objekte:

%Vor%

Jetzt habe ich eine Template-Klasse ( %code% ), die eines dieser Objekte aufnehmen kann. Aber wegen der Codebasisgröße und der Kompilierungszeiten möchte ich die Implementierung meiner Vorlagenmethode in einer cpp-Datei haben.

Also am Ende von baz.cpp habe ich:

%Vor%

Das Problem ist, dass ich viele Klassen wie %code% habe und auch die Liste der Objekte, mit denen sie arbeiten, ändert sich ständig. Also ... kann ich meine einzelne Typliste von Objekten trotzdem behalten und diese in der cpp-Datei jedes %code% -ähnlichen Objektes zur Spezialisierung verwenden? Dann muss ich nur meine Typliste aktualisieren, wenn ich ein neues Objekt habe und alle Objektdateien neu erstellt werden.

    
___ tag123metaprogrammierung ___ Metaprogrammierung ist die Fähigkeit, die Programmierumgebung wie bei Makros oder Metaklassen neu zu programmieren. ___ tag123templatespezialisierung ___ Template-Spezialisierung bezieht sich auf vom Programmierer generierte explizite Spezialisierung von Templates für bestimmte Typen. ___ answer33106646 ___

Das Wichtigste zuerst: Die korrekte Syntax für die explizite Klassenvorlageninstanziierung lautet

%Vor%

nicht %code% , das ist eine explizite Klassenvorlagenspezialisierung (Vorwärtsdeklaration).

Eine Möglichkeit könnte darin bestehen, eine Klasse instanziieren, die so aussieht

%Vor%

würde die implizite Instanziierung von %code% , %code% , %code% erzwingen. Nun, aber Sie möchten dies von %code% erstellen. Das %code% ist ein bereits spezialisiertes Template und es gibt in C ++ keine Möglichkeit, über Template-Parameter in %code% von der "Außenwelt von %code% " zu iterieren.

Eine andere Möglichkeit wäre die Verwendung von Makro, aber selbst im Makro können Sie nicht Ihre ursprüngliche %code% verwenden. Ich würde schließen, Ihr Problem hat keine Lösung mit gegebenem %code% .

Als eine Lösung würde ich die Template-Instanziierung auf dem Compiler wenn möglich lassen. Nicht verwendete Vorlagen werden in diesem Fall nicht instanziiert. Die langsame Kompilierung ergibt sich aus der Art und Weise, wie die Meta-Programme spezifiziert werden.

    
___ answer33084314 ___

Die %code% -Zeile forwards deklariert eine Spezialisierung und keine Template-Instantiierung, von der ich annehme, dass sie das ist, was Sie wollen.

Ich glaube nicht, dass es einen direkten Weg gibt, dies zu tun, Sie müssen etwas Metaprogrammierung machen. Sie können Boost.Preprocessor verwenden, um den gesamten benötigten Code zu generieren:

%Vor%

Es kann einen Weg geben, dies ohne Präprozessor zu tun, aber dies würde zusätzliche Anforderungen an den %code% -Typ stellen. Der Punkt besteht darin, den Typ in einem Kontext zu verwenden, in dem er instanziiert werden muss, einschließlich aller seiner Methoden.

    
___
2
Antworten

Klassenvorlagen-Spezialisierung, die alle Versionen von const / volatile Qualifikationen und & vs && akzeptiert

Ich spezialisiere std::common_type für meinen Typ. Ich habe folgende Spezialisierung definiert: %Vor% Und alles ist gut. Dann kommt jemand vorbei und ruft std::common_type<my_type, my_type &> auf. Die Standardversion verhält...
23.11.2013, 19:39
2
Antworten

Spezialisieren einer Funktionsvorlage, die einen universellen Referenzparameter verwendet

Wie spezialisiere ich eine Funktionsvorlage, die einen universellen Referenzparameter verwendet? foo.hpp: %Vor% foo.cpp %Vor% Hier ist Class nicht länger ein abgeleiteter Typ und somit Class genau; Es kann unmöglich sein, Class...
30.11.2012, 22:27
1
Antwort

C ++ spezialisieren ein Lambda für einen bestimmten Typ [duplizieren]

Ich habe mit dem Lambda "Überladen" herumgespielt, wie es dargestellt ist hier und kam schnell zu dem Punkt, an dem ich es für zweckmäßig hielt, spezialisierte Lambda-Verschlüsse zu erstellen. Also war ich zum ersten Mal ein wenig versuchswe...
14.02.2016, 15:36
5
Antworten

Benötigen Vorlagenspezialisierungen eine Vorlagensyntax?

Ich habe eine Besucher-Klasse, die dieser ähnelt: %Vor% Offensichtlich ist operator()(bool b) eine Spezialisierung der vorhergehenden Template-Funktion. Allerdings hat es nicht die template<> -Syntax, mit der ich früher ve...
01.06.2009, 22:22
5
Antworten

teilweise Spezialisierung von Funktionsvorlagen

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 Spezialisi...
15.02.2011, 10:40
3
Antworten

Wie spezialisieren Sie nur einige Mitglieder einer Vorlagenklasse?

Code: %Vor% FEHLER: %Vor% Grundsätzlich möchte ich nur eine Funktion spezialisieren und die allgemeine Definition für andere Funktionen verwenden. (Im eigentlichen Code habe ich viele Funktionen, die ich nicht spezialisieren möchte)....
10.02.2011, 10:01
5
Antworten

Spezialisierung std :: optional

Ist es möglich, std::optional für benutzerdefinierte Typen zu spezialisieren? Wenn nicht, ist es zu spät, dies dem Standard vorzuschlagen? Mein Anwendungsfall dafür ist eine ganzzahlige Klasse, die einen Wert innerhalb eines Bereichs darst...
29.09.2013, 17:35
3
Antworten

Vorlage teilweise Spezialisierung für __stdcall Funktionszeiger

%Vor% Der obige Code gibt mir den folgenden Fehler in Visual C ++ 2010: %Vor% Wie Sie das Problem mit __stdcall Modifikator sehen können. Ist das der Compilerfehler?     
13.05.2011, 12:00
3
Antworten

Template-Klasse unvollständige Spezialisierung

Ich stieß auf einen interessanten Punkt, den ich nicht erklären konnte oder für den ich keine Erklärung finden konnte. Berücksichtigen Sie die folgende Vorlagendefinition (kompiliert mit mingw g ++ 4.6.2): ​​ %Vor% Wenn wir wollen, können wir...
17.12.2012, 22:59
1
Antwort

Was funktioniert mit der Funktion has_member nicht korrekt?

Ich probiere Beispiele aus Walter Browns TMP-Talk aus und versuche, seine% co_de zu bekommen % Implementierung funktioniert. Die Implementierung scheint jedoch fälschlicherweise wieder wahr zu sein, was zu der Annahme führt, dass es einige...
11.06.2015, 12:59