ich eine Bibliothek verwende, die fast ausschließlich aus Templat Klassen und Funktionen in Header-Dateien, wie folgt zusammen:Klassendefinitionen automatisch von Deklarationen trennen?
// foo.h
template<class T>
class Foo {
Foo(){}
void computeXYZ() { /* heavy code */ }
};
template<class T>
void processFoo(const Foo<T>& foo) { /* more heavy code */ }
Nun ist dies schlecht, weil kompilieren Zeiten sind unerträglich wenn ich gehören einer dieser Header Dateien (und tatsächlich schließe ich viele von ihnen in jede meiner Kompilierungseinheiten ein).
Da als Template-Parameter ich nur ein oder zwei Arten verwenden sowieso Ich plane, für jede Bibliothek Header-Datei zu erstellen, eine Datei, die nur Erklärungen, ohne die schwere Code enthält, wie folgt aus:
// NEW: fwd-foo.h
template<class T>
class Foo {
Foo();
void computeXYZ();
};
template<class T>
void processFoo(const Foo<T>& foo);
Und dann eine Datei, die alle Instanziierungen erstellt, die ich brauche. Diese Datei kann separat einmal kompiliert und für alle:
// NEW: foo.cpp
#include "foo.h"
template class Foo<int>;
template class Foo<double>;
template void processFoo(const Foo<int>& foo);
template void processFoo(const Foo<double>& foo);
Jetzt kann ich nur fwd-foo.h
in meinem Code enthalten und haben kurze Zeiten kompilieren. Ich werde am Ende gegen foo.o
verknüpfen.
Der Nachteil ist natürlich, dass ich diese neuen fwd-foo.h
und foo.cpp
Dateien selbst erstellen muss. Und natürlich ist es ein Wartungsproblem: Wenn eine neue Bibliotheksversion veröffentlicht wird, muss ich sie an diese neue Version anpassen. Gibt es noch andere Nachteile?
Und meine Hauptfrage ist:
Gibt es eine Chance, dass ich diese neue Dateien erstellen kann, insbesondere fwd-foo.h
, automatisch von den ursprünglichen foo.h
? Ich muss dies für viele Bibliotheks-Header-Dateien tun (vielleicht 20 oder so), und eine automatische Lösung wäre am besten, wenn eine neue Bibliotheksversion veröffentlicht wird, und ich muss dies mit der neuen Version wiederholen. Gibt es Werkzeuge für diese Aufgabe?
EDIT:
Zusätzliche Frage: Wie kann die neu unterstützten extern
Stichwort helfen Sie mir in diesem Fall?
Das scheint genau das zu sein, was ich gesucht habe. Obwohl ich jetzt irgendwie müde bin, es tatsächlich zu benutzen ... – Frank