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

Variadische Template-Spezialisierung mit const-Referenz

Wie spezialisiere ich die variadische Template-Funktion, die const als Referenz für ein Argument hat? Beispiel: %Vor% Beim Aufruf der Funktion foo mit dem deklarierten const Test& -Argument sieht der Compiler keine spezielle Funkti...
17.03.2017, 09:37
3
Antworten

Ist es sicher, die Definition der Spezialisierung der Template-Member-Funktion (withOUT default body) in der Quelldatei zu platzieren?

Folgendes meine ich: %Vor% - %Vor% - %Vor% Das ist völlig in Ordnung, oder? Ich fing an, das zu bezweifeln, weil ich gerade den specialization of '...' after instantiation -Fehler übersprungen habe, was für mich neu war. Also h...
10.04.2014, 13:20
2
Antworten

gcc vs. clang Verhalten bei partieller Spezialisierung mit variadischen Argumenten plus Zusatzargument desselben Typs

Der folgende Code: %Vor% ... kompiliert nicht mit g++ (version 5.1.0 und 5.3.0 ) aufgrund:    Fehler: Teilspezialisierung ist nicht spezialisierter als die primäre Vorlage, da sie mehrere Parameter durch eine Stapelerweiterung ers...
29.03.2016, 19:10
2
Antworten

C ++ - Vorlage auf Anwesenheit / Abwesenheit eines Klassenmitglieds spezialisieren?

Betrachten Sie Folgendes: %Vor% Ich möchte C so spezialisieren, dass C & lt; A & gt; bekommt eine Spezialisierung und C & lt; B & gt; bekommt das andere, basierend auf der Anwesenheit oder Abwesenheit des Typenamens T :: foo. Ist das möglich...
27.04.2012, 16:53
2
Antworten

Ist es möglich, std :: enable_if zu verwenden, um eine Mitgliedervorlagenspezialisierung auszuwählen?

Gegeben eine Klassendeklaration %Vor% Ich möchte A::foo für verschiedene Typen ( int , ...) und Klassen (POD, non-POD) von T spezialisieren. Leider kann ich std::enable_if nicht für letzteres verwenden. Folgendes kompiliert nicht:...
26.10.2012, 10:02
3
Antworten

Wie kann man die Anwesenheit einer inneren Klasse in einer Klasse über SFINAE testen?

Ich versuche eine andere Template-Spezialisierung für Klassen zu haben, die eine innere Klasse mit einem bestimmten Namen haben. Ich habe einen Hinweis von hier genommen und Folgendes versucht : %Vor% Wie Sie sehen können, funktioniert es,...
22.08.2012, 06:15
2
Antworten

Implementieren von Multiparameter-C ++ - Vorlage wie Verhalten bei C # mithilfe von Richtlinienmuster

Ich versuche, eine C ++ - ähnliche Vorlage mit C # -Generika und einem Richtlinienmuster basierend auf dieser Antwort zu implementieren > Dies ist ein Beispiel für das Muster: %Vor% Mein beabsichtigtes Verhalten ist wie folgt: %Vor%...
16.03.2016, 22:33
1
Antwort

Spezialisiert statisches consExpr-Datenelement

Ich habe eine Klasse, um einige Eigenschaften eines Typs zu beschreiben. %Vor% Ich möchte my_traits::some_trait spezialisieren, aber wenn ich es versuche: %Vor% Der Compiler beschwert sich, dass my_traits::some_trait bereits einen...
13.03.2016, 17:57
3
Antworten

So definieren Sie Freunde für Klassen, die in der Vorlagenklasse definiert sind

Angenommen, ich habe die folgende Vorlagenklasse, die eine geschachtelte Klasse definiert: %Vor% Angenommen, die von mir codierte Umgebung hat die folgende Hilfsklasse, die auf jeden Typ spezialisiert sein sollte, der eine spezielle Behandlu...
21.08.2015, 16:07
4
Antworten

Template-Spezialisierung mit Template-Argument

Nehmen wir an, wir hätten eine template class Foo : %Vor% Ich habe eine andere template class Bar (unabhängig von der ersten): %Vor% Sagen wir, ich möchte die Methode foo() für jede Klasse Bar spezialisieren. Ich würde f...
07.11.2017, 15:52