Ich möchte alle impliziten Template-Instanziierungen für eine bestimmte Template-Klasse verhindern, um zu verhindern, dass sie in jede Übersetzungseinheit instanziiert wird.Wie verhindere ich implizite Template-Instanziierungen für eine bestimmte Vorlage?
Es sieht aus wie meine Optionen sind:
- Verwenden -fno-implizite-Vorlagen auf Befehlszeile des gcc. Diese unterdrückt alle impliziten Template-Instanziierungen und ist nicht was ich will. Ich möchte das nur für eine einzelne Vorlage verhindern.
- Verwenden Sie C++ 11 "externe Vorlage". Dies unterdrückt jedoch nur explizite explizite Instanziierungen. Ich möchte nicht eine "extern Vorlage" Zeile für jede mögliche Vorlage Parameterliste geben diese Vorlage könnte instanziiert werden mit.
Also brauche ich etwas dazwischen. Es wäre schön zu haben:
extern template class Foo; // suppress all implicit instantiations of Foo
(Beachten Sie das Fehlen von Template-Parameter (n).) Irgendwelche Ideen?
Was ist der Anwendungsfall? Möchten Sie verhindern, dass bestimmte Instanziierungen überhaupt verwendet werden, oder einfach nur versuchen, den Speicherplatz für Objektdateien und die Verknüpfungszeit zu sparen? – user657267
Ich versuche, die Kompilierzeit zu speichern. Es macht einen großen Unterschied in diesem Fall. Und obwohl ich die Disassemblierung gelegentlich durchkämmen könnte, um neue Instanzen zu finden, die explizit extern dargestellt werden müssen, würde ich bevorzugen, dass der Linker nur einen Fehler bei neuen impliziten Instanziierungen macht, damit sie sofort zur Liste der Expliziten hinzugefügt werden können Instanziierungen durch die Person, die die kausale Modifikation macht. –
Sie könnten die Vorlagendefinition zwischen einer Kopf- und einer Quelldatei wie bei einem Nicht-Template aufteilen. Wenn Sie die Vorlage für die Gruppe der zulässigen Typen in der Quelldatei nicht explizit instanziieren, schlägt die Verknüpfung fehl. – Praetorian