Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Compilezeit Polymorhismus mit untersch. Compilern

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
29.11.2009, 16:53 Uhr
~Uffob
Gast


Hallo,

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 /*...*/ );
};

template<typename technique>
class manager
{
  void general_stuff ()
  {
   // mach allgemeines
  }

  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;

  m1.general_stuff ();
  m1.special ();

  m2.general_stuff ();
  m2.special ();
}

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
29.11.2009, 17:46 Uhr
0xdeadbeef
Gott
(Operator)


Es gibt etwa zwanzigtausend Wege, da zum Ziel zu kommen. Denkbar wäre etwa

C++:
#ifdef PARALLEL
typedef manager<parallel> manager_t;
#else
typedef manager<sequential> manager_t;
#endif


...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
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
29.11.2009, 17:48 Uhr
~Uffob
Gast



Zitat:

Dass der Parallelteil gegebenenfalls nicht gebaut wird, das wirst du allerdings im Buildsystem lösen müssen.



sorry aber wie? Oder was meinst du damit? denn genau hier hänge ich....
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
29.11.2009, 17:53 Uhr
0xdeadbeef
Gott
(Operator)


Wie das genau geht, hängt davon ab, welches Buildsystem du benutzt. In make etwas in der Art:

Code:
ifeq($(PARALLEL),yes)
  MANAGER_BACKEND=parallel
else
  MANAGER_BACKEND=sequential
endif

programm: $(MANAGER_BACKEND).o main.o


...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
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: