beste Methode temlpates zu organisieren?



  • Hallo Leute,

    Ich wollte mal horchen, ob und wie Ihr temlpates organisiert.

    In meinem Fall habe ich mehrere Klassen (in separaten Dateien), die alle auf die identischen template-Funktionen zugreifen sollen. Da templates nicht Dateiübergreifend funktionieren (mit Ausnahme des Headers der jeweiligen .cpp-Datei), könnte man verschiedene workarounds anwenden.

    1. Ich kann in jeder Klasse den Code kopieren. Wäre bei mir ca. 600 Programmzeilen/Klasse die ich kopieren müsste und bei Änderungen muss ich jede Stelle anpassen. ...nicht so der hit.
    2. Ich nutze das Schlüsselwort 'export'. Wird kaum unterstützt und ist scheinbar wie der gute alte 'goto' verhasst. ...auch keine so tolle Option.
    3. Ich lager den Code aus und inkludiere diesen am Ende der Header-Datei. Typische Dateiendungen: .ipp oder .impl. ...für mich zumindest ungewohnt und meine IDE (Eclipse CDT unter Linux) erkennt diese Dateiendungen zumindest nicht nativ.

    Ich tendiere zu Option 3. Hattet Ihr auch schon solche Fälle und wie hattet ihr das gelöst?

    viele Grüße,
    SBond



  • 0. Template in Headerdatei implementieren und überall dort einbinden, wo sie benötigt werden



  • klingt logisch. 😃



  • Es ist auch durchaus verbreitet die Implementierung in eine Datei (ipp, o.ä.) auszulagern und diese dann am Ende des Headers zu inkludieren. Ich mache das aber nicht, weil ich den Nutzen für fragwürdig halte. Wenn es keine Vorteile gäbe bezüglich der Kompilierung (z.B. um Kompilierzeiten klein zu halten oder bei Libraries) würde ich sogar alles inline implementieren, wie es z.B. in C# oder Java üblich ist. Die Trennung in Schnittstelle und Implementierung finde ich irgendwie ziemlich bloatig. Moderne IDEs erlauben es ohnehin den Code zu falten oder eine wie auch immer geartete Ansicht auf die Schnittstellen zu extrahieren.



  • nicht export, sondern extern hilft.
    In einer cpp-Datei, die das Template nutzt (muss natürlich inkludiert werden):

    extern template class Meintyp<int>;
    extern template class Meintyp<std::string>;
    
    void f() {
      MeinTyp<int> objekt;
      // usw.
    }
    

    Das verhindert die Instanziierung. In einer eigenen Datei instanzen.cpp, die zum Projekt gehört, bringt man die expliziten Instanziierungen unter:

    template class MeinTyp<int>;       // explizite Instantiiierung
    template class Meintyp<std::string>;  // explizite Instantiiierung
    

    Der Vorteil: Auch bei hunderten von Dateien, die das Template nutzen, wird der Objektcode für int bzw. std::string nur einmal angelegt - im Gegensatz zu der Lösung, die alle Dateien nur das Template inkludieren lässt.



  • Da muss mein Code aber schon echt lange zum compilieren brauchen bevor ich sowas nutze.



  • sebi707 schrieb:

    Da muss mein Code aber schon echt lange zum compilieren brauchen bevor ich sowas nutze.

    Du hast recht, für Hobby-Programmierer ist das nichts. Aber es kann sein, dass einige hier im forum größere Projekte bearbeiten, für die das vllt. von Interesse ist.



  • Export ist doch eh schon deprecated oder removed.



  • Mechanics schrieb:

    Export ist doch eh schon deprecated oder removed.

    Echt jetzt? Was ist denn das C++11-Äquivalent für den oben beschriebenen Fall? Für einfache Container und Sachen die nicht zu TMP-lastig sind ist das nämlich perfekt um die Compiletime im Zaun zu halten. Wenn ich weiß, dass ich zu 90% doubles oder ints irgendwo reinstecken werde, dann kompiliere ich die Fälle eben vorher weg.



  • extern templates, so wie weiter oben beschrieben.



  • Ach so, sorry. Hatte versehentlich extern gelesen bei Dir. Das Sprachfeature export wurde ja auch nie richtig unterstützt, bis auf den Comeau-Compiler vielleicht noch.


Anmelden zum Antworten