Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Templates: Zur Laufzeit entscheiden?

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
13.03.2009, 10:49 Uhr
~testo
Gast


Hallo,

ich habe eine Frage. Habe ich in irgendeiner Art und Weise die Möglichkeit abhängig vom eingelesenen Datentyp ein z.B. template-basiertes Array zur Laufzeit zu befüllen?

Genauer: Ich lese z.B. nur reelle Werte ein oder komplexe. Also entweder besteht jede Zahl nur aus einer (reellen) Zahl oder aus zwei Zahlen. Bsp:
(4.5) oder eben (4.5 8.9).
Diese stehen z.B. in einer Datei die ich einlese. Das Programm kann auslesen welche Art das ist, also ob reell oder komplex.
Jetzt möchte ich ein template-basiertes array füllen.
Mir fällt nichts anderes ein als:

C++:
switch(type)
{
    case real:
        fülle_array_real();
    case komplex:
        fülle_array_komplex();
}    




Gäbe es eine Möglichkeit beides zu vereinen um code nicht doppelt zu halten mit evtl. einer template-methode fülle_array(type)?

Ich habe mal von irgendjemandem gehört es gäbe eine Möglichkeit dies zur Laufzeit zu entscheiden - mir geistert das im Kopf rum - deswegen die frage.

Danke
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
13.03.2009, 12:56 Uhr
ao

(Operator)


Was bringt das?

Konsequenz von verschiedenen Arrays ist, dass reell- und komplexwertige Datendateien durchgängig getrennt verarbeitet werden müssen. In jedem Schritt, der auf die Daten zugreift, muss unterschieden werden:

Code:
if (type == real)
{
    // work on real-array
}
else
{
    // work on complex-array
}



Ist es vielleicht besser, immer ein Komplex-Array zu füllen und im Fall von reellwertigen Daten die Imaginärteile auf 0 zu setzen?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
13.03.2009, 13:07 Uhr
~testo
Gast


Eh ich glaube wir reden aneinander vorbei? Was bringt was?
Also ich hab 1 Array welches entweder nur reelle werte trägt oder komplexe strukturen. Deswegen ist dieses array templatebasiert und ich muss die falluntrescheidung nur einmal machen.
Da ich mit OpenMP/MPI paralle prozesskommunikation habe ist unnötiger overhead im falle reeller daten nicht erwünscht weil zu teuer.
Meine Frage war also ob es möglich ist zur Laufzeit unabhängig vom typ das array zu befüllen?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
13.03.2009, 13:25 Uhr
Tommix



Hallo,
ob Du ein Array<float> oder ein Array<complex> erzeugst, entscheidet sich in jedem Fall beim compilieren. Du kannst aber für einzelne Typen optimierte Methoden spezialisieren:

C++:
template<typename T> class Array
{
public:
    void Fill();
};

template<typename T> void Array<T>::Fill()
{
    //    ...
}

template<> void Array<float>::Fill()
{
    //    ...
}

template<> void Array<complex>::Fill()
{
    //    ...
}



Gruß, Tommix
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
13.03.2009, 14:15 Uhr
~testo
Gast


Lieber tommix, danke für deinen beitrag. Bist du sicher dass beim compilieren sich entscheidet? Ich glaube eben nicht. Erst zur Laufzeit entscheidet sich ob das array complex oder float wird.

und gerade dein code-bespiel ist genau das was ich vermeiden will bzw. worauf die frage abzielt: Muss ich für jeden typen eine spezialisierung schreiben oder kann ich irgendwie zur Laufzeit ein allgemeingültiges templates-basiertes Fill() aufrufen?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
13.03.2009, 15:11 Uhr
Tommix



Du kannst

C++:
Array<float> a1; // und
Array<complex> a2;


schreiben, aber nicht

C++:
Array<überleg ich mir später> a3;

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
13.03.2009, 15:21 Uhr
Kest
saint


An 'ne andere Sprache gedacht?
--
Wenn man einen Hufschlag hört, sollte man >Pferd< denken und nicht >Zebra<.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
13.03.2009, 15:38 Uhr
FloSoft
Medialer Over-Flow
(Administrator)



Zitat von ~testo:
Lieber tommix, danke für deinen beitrag. Bist du sicher dass beim compilieren sich entscheidet? Ich glaube eben nicht. Erst zur Laufzeit entscheidet sich ob das array complex oder float wird.

und gerade dein code-bespiel ist genau das was ich vermeiden will bzw. worauf die frage abzielt: Muss ich für jeden typen eine spezialisierung schreiben oder kann ich irgendwie zur Laufzeit ein allgemeingültiges templates-basiertes Fill() aufrufen?

templates werden immer zur compile-zeit erzeugt, d.h das wird nicht während der laufzeit gemacht, wäre auch hirnrissig. So kann der Compiler dann wenigstens optimieren, während der laufzeit wär das kaum möglich. über templates dürfte deines sogar kostengünstiger sein, weil die ganzen if(type == ...) wegfallen, was doch immer mindestens nen vergleich verursacht, bei templates stehts scho vorgegeben im speicher

Dein code wird halt durch templates größer, aber heißt nicht das er langsamer wird dadurch. Wenn dir an Geschwindigkeit was liegt, dann ist auch der Real-Type als Complex zu betrachten net so verkehrt, wie tommix sagt (oder wars ao?) wäre das dann evtl zwar speicherintensiver, aber schneller als eine gleiche behandlung für alle typen gibts wahrscheinlich kaum.
--
class God : public ChuckNorris { };
 
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: