Anzeige:
Ergebnis 1 bis 11 von 11

Thema: [C++] Haben Templates Nachteile?

  1. #1
    Registrierter Benutzer Avatar von BLUESCREEN3D
    Registriert seit
    08.11.2002
    Beiträge
    665

    [C++] Haben Templates Nachteile?

    Haben Templates (im Zusammenhang mit Funktionen) irgendwelche Nachteile, die man beachten muss?

    Wenn ich beispielsweise eine Funktionen square() für zwei verschiedene Datentypen brauche, ist es dann eine gute Idee, diese mittels eines Templates zu realisieren, obwohl eigentlich nur zwei Datentypen benötigt werden?

    Eine Möglichkeit, eine Template-Funktion nur für bestimmte Datentypen ("dieses Template ist nur für int und unsigned int") zu schreiben ist wohl nicht möglich, oder?

    Wäre es allgemein empfehlenswert, zu überladenen Operator-Funktionen einer Klasse noch welche mit Template hinzuzufügen, damit beliebige Datentypen berücksichtigt sind?

  2. #2
    Registrierter Benutzer Avatar von panzi
    Registriert seit
    04.05.2001
    Ort
    Kottingbrunn
    Beiträge
    609
    Zitat Zitat von BLUESCREEN3D
    Haben Templates (im Zusammenhang mit Funktionen) irgendwelche Nachteile, die man beachten muss?
    Für jeden Typ den du als Templateparameter einsetzt wird eigener Code generiert. Also hast du list<int> und list<double> so ist in deiner Binarie Code für 2 Listenklassen drinn. Aber das ist net weiter schlimm, denn wie willst das sonst (gescheit!) machen?

    Ander Nachteile:
    Eine template Methode kann nicht virtual sein!
    Templates müssen ganz im Header implementiert werden.
    Bie Template Compilererrors ists manchmal der Horror rauszufinden was jetzt eigentlich falsch ist.
    Wenn ich beispielsweise eine Funktionen square() für zwei verschiedene Datentypen brauche, ist es dann eine gute Idee, diese mittels eines Templates zu realisieren, obwohl eigentlich nur zwei Datentypen benötigt werden?
    Das ist oft geschmakssache, aber hier finde ich ein Template schon gut. Man kann ja templates auch speziellisieren, so das du eine optimierte Variante für einen speziellen Typ anbieten kannst.
    Code:
    // allgem. templ. funktion
    template< typename T >
    T foo(T x) {
       // ...
       return x;
    }
    
    // und nun die spezialisierung
    template<>
    int foo<int>(int x) {
       // ...
       return x;
    }
    Eine Möglichkeit, eine Template-Funktion nur für bestimmte Datentypen ("dieses Template ist nur für int und unsigned int") zu schreiben ist wohl nicht möglich, oder?
    Doch. So wie im Code gezeigt ohne der 1. Funktion. Aber worinliegt der Sinn?
    Wäre es allgemein empfehlenswert, zu überladenen Operator-Funktionen einer Klasse noch welche mit Template hinzuzufügen, damit beliebige Datentypen berücksichtigt sind?
    Kommt auf den speziellen Fall drauf an. Aber wie willst du mit Typen, die du nicht kennst umgehn? Naja, wenn du annimmst das es Numerische Typen sind, dann eventuell. Dann wird dein Compiler eben schreien wenn du einen nicht Kompatieblen Typen übergibst.
    Intel Core 2 Duo CPU 2.66GHz; Nvidia GeForce 8 8800 GTS; 4GB RAM; Fedora 12; KDE-testing

  3. #3
    Registrierter Benutzer Avatar von BLUESCREEN3D
    Registriert seit
    08.11.2002
    Beiträge
    665
    Zitat Zitat von panzi
    Code:
    // und nun die spezialisierung
    template<>
    int foo<int>(int x)
    Ich habe die Spezialisierung immer so geschrieben:
    Code:
    int foo(int x)
    Gibt es da einen Unterschied?

    Zitat Zitat von panzi
    Eine Möglichkeit, eine Template-Funktion nur für bestimmte Datentypen ("dieses Template ist nur für int und unsigned int") zu schreiben ist wohl nicht möglich, oder?
    Doch. So wie im Code gezeigt ohne der 1. Funktion.
    Ich meinte das eher im Sinne von "eine Spezialisierung, die mehrere Datentypen abdeckt". Nach dein Beispiel braucht man ja eine Spezialisierung pro Datentyp.

  4. #4
    Registrierter Benutzer
    Registriert seit
    23.05.2004
    Beiträge
    592
    Ich habe die Spezialisierung immer so geschrieben:

    Code:
    int foo(int x)
    Gibt es da einen Unterschied?
    Der Unterschied ist, dass dies gar keine Spezialisierung ist :-) Es handelt sich einfach um überladen.

    Ich meinte das eher im Sinne von "eine Spezialisierung, die mehrere Datentypen abdeckt". Nach dein Beispiel braucht man ja eine Spezialisierung pro Datentyp.
    Funktionstemplates kann man leider nur vollständig spezialisieren, aber das wird sich möglicherweise mit der nächsten Ausgabe des Standards ändern.

  5. #5
    Registrierter Benutzer Avatar von BLUESCREEN3D
    Registriert seit
    08.11.2002
    Beiträge
    665
    Zitat Zitat von locus vivendi
    Der Unterschied ist, dass dies gar keine Spezialisierung ist :-) Es handelt sich einfach um überladen.
    Natürlich, aber ich meinte, ob es im Endeffekt einen Unterschied macht und ob damit eine der beiden Varianten zu bevorzugen ist

  6. #6
    Registrierter Benutzer
    Registriert seit
    25.10.2004
    Beiträge
    819
    Die template-Variante ist zu bevorzugen. Wenn du spezialiseren willst, solltest du das auch tun, und nicht ein anderes Feature nehmen, das zufällig zum selben Ergebnis führt.

  7. #7
    Registrierter Benutzer
    Registriert seit
    18.03.2005
    Beiträge
    211
    Eine template Methode kann nicht virtual sein!
    Was genau meinst du damit ?
    Was ist eine template methode ?

    wenn du eine Methode an einem Objekt meinst, die selber noch mal nen template ist, hasst du sicher recht (macht man eh seltener, und manche compiler machen eh nur probleme draus), aber nen object als template mit normalen methoden kann sowohl virtuelle methoden deklarieren als auch definieren.
    Und ne (template)function die nich an nem objekt haengt muss eh nicht virtual sein koennen.

    Das ist oft geschmakssache, aber hier finde ich ein Template schon gut.
    Templates sind oft der einzige weg, code general wiederverwendbar zu machen, und dabei performant zu bleiben.
    Es gibt meisten 1000 möglichkeiten ein template zu umgehen, aber wenn das template ned grad grausam programmiert war, ist das template meist immer die schnellste und unkomplizierste Variante (wenn man damit umgehen kann ^^).

    Wäre es allgemein empfehlenswert, zu überladenen Operator-Funktionen einer Klasse noch welche mit Template hinzuzufügen, damit beliebige Datentypen berücksichtigt sind?
    Kommt ganz drauf an was du machen willst ....
    Bedenke, das eine template funktion sich fuer jeden typ eine version "generiert", du also an der stelle jegliche Typsicherheit quasi ausschaltest. Wenn die funktion/methode also mit wirklich jeden typ funktionieren soll, ist das ok ... wenn nicht, iss bisserl mehr kreativitat gefragt ^^

    Ciao ...
    Geändert von RHBaum (27-03-2006 um 09:21 Uhr)

  8. #8
    Registrierter Benutzer
    Registriert seit
    25.10.2004
    Beiträge
    819
    Den einzigen wirklichen Nachteil von templates sehe in darin, dass u.U. die Fehlermeldungen mehr oder weniger Datenmüll werden können; insbesondere, wenn du die STL ausgiebig nutzt.

    Bei einem C++ Programm, welches exzessiven Gebrauch von Templates macht, hatte ich es schonmal, dass ein einziger Fehler eine Ausgabe von 120 Zeilen Fehlercode produzierte.

  9. #9
    Registrierter Benutzer
    Registriert seit
    25.10.2004
    Beiträge
    819
    Und natürlich kann man mit templates auch Berechnungen zur Compilierzeit durchführen
    Code:
    #include <iostream>
    
    template<int N> struct fact
    {
       enum {value=N * fact<N-1>::value};
    };
    
    template<> struct fact<0>
    {
       enum {value = 1};
    };
    
    int main()
    {
       std::cout << "10! = " << fact<10>::value << std::endl;
    }
    Dieses Programm führt keinerlei Berechnungen zur Laufzeit aus.

  10. #10
    Registrierter Benutzer
    Registriert seit
    18.03.2005
    Beiträge
    211
    Da gabs doch mal den Wettbewerb in der Ct, wo son Problem mitm Wuerfel durch backtracking geloest werden sollte.

    absolut schnellste version war halt auch einer, der das mit compilerarithmetik rauscompiliert hat ^^ laufzeit halt das was er zur ausgabe der ergebnisse brauchte ^^
    Wurde aber nicht gewertet, weil die eingabe-parameter logischerweisse nicht als variablen vorgelegen haben ... und die laufzeit ja nun so nich gemessen werden kann ^^

    Ciao ...

  11. #11
    Registrierter Benutzer
    Registriert seit
    25.10.2004
    Beiträge
    819
    IIRC hatte er auch nur ein proof-of-concept mit einem vereinfachten Problem vorgelegt, da die Compilierzeit beim echten Problem nicht mehr erlebbar war

    BTW: Für Freunde der Template-Metaprogrammierung: (ich bin keiner )

    http://www.boost.org/libs/mpl/doc/index.html

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •