Kann man templatememberfunktionen auslagern?



  • Moin,
    ich möchte eine DLL anbieten, mit deren Hilfe sich div. Sachen machen lassen. Leider sind größtenteils templates der DLL-Inhalt. Damit die Nutzer von der Implementierung der memberfunktionen abgeschirmt werden muss ich die Memberfunktionen aus der Header-Datei rausholen. Gibt es so eine Möglichkeit und wenn ja, wie?

    mfg
    Glamdring



  • Das geht nicht, selbst mit export nicht.



  • Ok, danke.

    mfg



  • Bashar schrieb:

    Das geht nicht, selbst mit export nicht.

    Ich dachte, dass es rein theoretisch schon geht. Die meißten Compiler aber export noch nicht unterstützen.



  • Du könntest diese in eine extra Datei packen, diese im header includen wenn #if irgendwas ist.

    (z.B. #if DLLCompilieren
    #include <templateszurDLL>
    #endif // wenn nicht nutzt ein Anwender die DLL
    


  • Jover schrieb:

    Ich dachte, dass es rein theoretisch schon geht. Die meißten Compiler aber export noch nicht unterstützen.

    http://www.gotw.ca/publications/mill23.htm ➡

    Issue the First: Source Exposure
    * Source exposure for the definition remains: Not solved. Nothing in the C++ standard says or implies that the export keyword means you won’t have to ship full source code for g() anyway.

    Indeed, in the only existing (and almost-available) implementation of export, the compiler requires that the template’s full definition be shipped — the full source code.

    (Das ist eigentlich auch ganz logisch, wenn man mal drüber nachdenkt.)

    Zweiter Teil: http://www.gotw.ca/publications/mill24.htm



  • Ich werde mal Knuddlbaers Lösung ausprobieren, aber ich fürchte, dass ich die andere Datei dann auch bei der DLL mitgeben muss und die Nutzer entsprechend immernoch die Implementierung sehen könnten, aber ich versuchs dennoch

    thx



  • Naja, nach aussen kannste das Template eh nicht geben.

    d.h. wenn die DLL eine foo<> kennt kann der Anwender die von aussen nicht verwenden. Alles was dieser braucht ist die Schnittstellendefinition.

    Beispiel:

    extern "C"
    {
       __dllexport void foo(int a);
    }
    
    #ifdef DLLErstellen
    #include "myDLLInternalTemplates.templ"
    #endif
    

    Wenn der Anwender nicht gerade DLLErstellen definiert hat müsste es gehen 🤡

    Nich schön aber geht...

    P.s.: Du kannst das include auch raus lassen und das separat in der .cpp der dll includen...



  • Bashar schrieb:

    (Das ist eigentlich auch ganz logisch, wenn man mal drüber nachdenkt.)

    Daveed Vandevoorde hat in microsoft.public.vc.stl mal n paar interessante Sachen gepostet.

    Es ging dabei darum, dass man mittels export templates in binaerer Form verkaufen kann - naemlich als Object (*.obj) Dateien - da der Compiler ja nicht unbedingt den Sourcecode braucht, sondern ein Object File ausreicht.

    Das ist natuerlich nicht so portabel wie zB eine DLL, aber immerhin.



  • Hm, kannste mal kurz anreißen, wie das funktionieren soll? Der Compiler braucht irgendeine Form von Zwischencode, um das Template zu instanziieren, d.h. man müsste IMO Zwischencode in .obj auslagern, was aber irgendwie trivial ist und am Thema vorbei geht ... gibts nen anderen Trick?



  • Ne, es geht einfach mit Zwischencode. Die Idee dahinter ist nur, dass du quasi ein 'offenes' Format dafür definieren kannst.

    So dass du quasi libraries mit 'kompilierten' Templates verkaufen kannst. Nichts revolutionäres, aber da es immer heisst: "auch mit export muss der source code offen liegen", dachte ich, dass das ganz interessant ist 😉


Anmelden zum Antworten