ich knabbere an einer Lösung für folgendes Problem: Ich möchte compilezeit polymorhismus über Templates erreichen da ich bereits zur compilezeit weiß was compiliert werden soll.
Bei dem unten stehenden template-Beispiel wird ja sowohl die KLasse Sequential als auch Parallel kompiliert.
Ich will aber in den Methoden der Klasse Parallel Bibliotheksaufrufe benutzen die die Klasse Sequential nicht hat. Dazu inkludiere ich in der Klasse Parallel einfach die entsprechenden Header. Kompiliere ich mit meinem DParallel flag läuft alles. Die parallele version zu erstellen geht also. Kompiliere ich jedoch ohne flag meckert der Compiler dass er die Library-funktionen nicht kennt - klar - es wird auch mit nem anderen Compiler kompiliert (g++ statt wie im parallelen mit mpicxx z.B).
Und wie kann ich das jetzt an meine Templates anpassen? Es sieht jetzt ganz danach aus als müsste ich jeden bibliotheksaufruf in der klasse Parallel in ein #ifndef packen...? Stimmt das?
Hier ein Pseudocode:
C++:
class sequential { void do_this_stuff (int p /*...*/ ); };
class parallel { void do_this_stuff (int p /*...*/ ); };
void special () { technique t; // mach ein Objekt von dem im moment gar nichts weisst, ausser, dass es t.do_this_stuff ( 2 ); // diese Funktion hier hat, also kannst du sie auch aufrufen } };
int main { manager<parallel> m1; // hier kannst du z.B die Auswahl machen zur Kompilierungszeit machen und gibst an welchen Typ du wirklich haben willst manager<sequential> m2;
...und dann manager_t zu benutzen. Dass der Parallelteil gegebenenfalls nicht gebaut wird, das wirst du allerdings im Buildsystem lösen müssen. -- Einfachheit ist Voraussetzung für Zuverlässigkeit. -- Edsger Wybe Dijkstra
...und dann den Code in parallel.cc bzw. sequential.cc schreiben. Dann kannst du das mit make PARALLEL=yes einstellen.
Auch das ist natürlich nur eine von vielen Möglichkeiten. Schau halt in die Dokumentation deines Buildsystems, da wird schon was von "conditional compilation" oder so stehen. -- Einfachheit ist Voraussetzung für Zuverlässigkeit. -- Edsger Wybe Dijkstra