Templates nach C++ wandeln



  • Hallo zusamms,
    kennt jemand eine Möglichkeit (oder ein Tool) Templates (vollständig spezalisiert) in "echten" C++ code zu wandeln d.h. z.B. aus dem Template vector<int> eine Klasse vector_int o.Ä. zu machen, die man dann z.B. vorkompiliert in eine Bibliothek einbinden kann.
    (Werden Templates vom z.B. beim gcc vom Präprozessoer verarbeitet, oder vom eigentlichen Compiler?)
    LG, J.



  • templates sind so ziemlich der echteste C++-Code den es gibt, und ob du jetzt vector_int oder vector<int> schreibst, ist doch im Endeffekt ziemlich egal.



  • templates werden immer zur compilezeit komplett erstellt,sie sind also schon "echt". mit dlls gibts eigentlich keine probleme, nur dass man auch beim aufrufen immer zb vector<int> schreiben muss.



  • Naja, von "unecht" wollte ich auch gar nicht wirklich reden, dennoch wäre es manchmal von Vorteil Templates schon vorzukompilieren, und in eine Bibliothek einzubinden....



  • JoeX schrieb:

    Naja, von "unecht" wollte ich auch gar nicht wirklich reden, dennoch wäre es manchmal von Vorteil Templates schon vorzukompilieren, und in eine Bibliothek einzubinden....

    Dazu brauchst du kein weiteres Tool. Da reicht dein Compiler und eine explizite Instanziierung:

    template class vector<int>;
    template class vector<Foo>;
    ...
    

    Das ganze packst du in eine cpp-Datei und fertig.
    Alternativ kannst du auch sowas wie das Instantiator-Framework verwenden:
    http://www.cuj.com/documents/s=8683/cuj0310niebler/
    http://www.geocities.com/eric_niebler/instantiator.html

    otze schrieb:

    templates werden immer zur compilezeit komplett erstellt

    Das werden sie zum Glück nicht. Templates werden nur soweit erstellt, wie es nötig ist. Explizite Instanziierungen hingegen sorgen dafür, dass ein Template komplett instanziiert wird.



  • JoeX schrieb:

    Naja, von "unecht" wollte ich auch gar nicht wirklich reden, dennoch wäre es manchmal von Vorteil Templates schon vorzukompilieren, und in eine Bibliothek einzubinden....

    schreib einfach keine templates, sondern makros.
    also statt des unnütig komlizieren

    template<class T>
    void swap(T& a,T& b){
       T tmp=a;
       a=b;
       b=tmp;
    }
    

    schreib das einfache

    #define make_swap(T)\
    void swap_##T(T& a,T& b){\
       T tmp=a;\
       a=b;\
       b=tmp;\
    }
    

    da weiß dann jeder, wo er dran ist und schneller compilieren tut es auch.
    hab das sogar mal mit verketteten listen gemacht. also einfach #define make_list(T)... und dann alle methoden in ein makro rein.
    kannst auch declare_list(T) und define_list(T) trennen, um noch bessere compilezeiten zu haben, wo templates gar nicht mehr mitkommen.

    (alle meine beiträge zu retro-c++ sind nicht ernst gemeint.)



  • @volkard
    so hab ich mal mit Shade die STL für C portiert :p



  • kingruedi schrieb:

    @volkard
    so hab ich mal mit Shade die STL für C portiert :p

    udn ich hab alle 3 tage im chat gesagt, daß das nicht gut ist.



  • ich war jung und brauchte ... 😉


Log in to reply