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.

    
___
1
Antwort

template metafunktion zum Erkennen von Vorlagenspezialisierungen

Inspiriert von dieser Frage frage ich mich, ob es eine Kompilierzeitprüfung gibt, die man einführen kann, um zu erkennen, ob zwei gegebene Template-Instanziierungen: %Vor% werden aus der gleichen Definition erstellt oder wenn sie aus versc...
09.01.2013, 18:34
1
Antwort

Erkennen, ob zwei Typen eine Spezialisierung derselben Klassenvorlage sind?

Ich würde gerne wissen, wie man eine Klasse type_traits schreibt, um festzustellen, ob es sich bei zwei Typen um Spezialisierungen derselben Vorlagenklasse handelt. Das große Problem ist, dass es für gemischte Typen / Nicht-Typen Template-Kla...
21.04.2013, 01:20
2
Antworten

enable_if Methodenspezialisierung

%Vor% Wie kann ich enable_if verwenden, um die folgende Spezialisierung für jeden Fließkommatyp (is_floating_point) zuzulassen? %Vor% BEARBEITEN: Hier ist eine Antwort, die ich gefunden habe, die sich von den unten aufgeführten unterscheide...
08.07.2011, 16:43
3
Antworten

Vorlagenspezialisierung für enum

Ist es möglich, eine Template-Methode für Enums zu spezialisieren? Etwas wie (der ungültige Code unten): %Vor% Falls es nicht möglich ist, dann, wenn ich Spezialisierungen für eine Reihe von Typen habe, wie int , unsigned int , long...
25.10.2009, 04:23
5
Antworten

Mehrere typename Argumente in C ++ Vorlage?

Wie kann ich mehrere Typname Argumente in einer C ++ Vorlage haben? %Vor% Verwendung: %Vor% Aber es wird nicht kompiliert. Wie könnte ich es kompilieren lassen?     
12.11.2013, 07:31
5
Antworten

Kann ich eine Template-Spezialisierung aus einer Typliste deklarieren?

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 ( baz ), die eines dieser Objekte aufn...
07.09.2015, 18:23