Kommerzielle Bibliothek veröffentlichen?
-
Hi!
Angenommen jemand entwickelt eine Bibliothek, d.h. cpps und Header werden kompiliert. Jetzt muss der Anwender, damit er damit arbeiten kann, ja die entsprechenden Schnittstellen bekommen. Z.B. "Lib.h".
"Lib.h" zieht jedoch nun z.B. "Template.h" an, eine Datei die eine benötigte Templateklasse enthält. Jetzt wird ja der ganze Quelltext öffentlich bzw. mit herausgegeben.
Kann man das irgendwie umgehen (Außer diese Comodo oder wie der heißt Compiler z verwenden :D)? Das man mit Vorwärtsdeklarationen schon viel erreicht weiß ich
-
Nein.
Es heisst uebrigens Klassentemplate, nicht Templateklasse.
-
Im Falle von Templates: Nein.
-
Also das Klassentemplate muss bekannt sein, aber die Implementierung der Nicht-Template-Klassen kann natürlich geheim bleiben, auch wenn diese das Klassentemplate nutzen.
-
Korrigiert mich wenn ich mich irre, aber die Template Klasse muß doch nur dann komplett bekannt sein wenn der Nutzer sie mit anderen Typen nutzen möchte als sie innerhalb des Libs verwendet wird. Oder irre ich mich da?
-
Was Eisflamme meinte, ist dass man z.B. eine Liste über void* (fast wie in C ;)) implementieren kann, dann aber ein Template Interface anbietet, um das Benutzen angenehm zu machen. Man schmeißt damit zwar uU ein paar Vorteile (Optimierungen) raus, aber es gibt viele Fälle in denen das geht. (Anwendung wäre z.B. außer seinen Code verstecken zu wollen, dass man auf Microcontrollern sicherstellen will, dass nur eine Implementierung im Speicher liegt.)
-
alternativ extern, dllexport(für DLLs) und explizite Instanzierung nutzen.
d.h. du schreibst dein Klassentemplate wie eine normale Klasse (Header und Source getrennt) und schreibst dann unter die Implementation (also am besten ans Ende der Source-Datei) für jede verwendete Spezialisierung eine explizite Instanzierung.
Im Header musst du die entsprechenden Spezialisierungen dann noch mit extern und gegebenenfalls dllexport markieren (MSVC: __declspec(dllexport), GCC: __attribute__((dllexport)))
Beispiel:
#pragma once // foo.h template <typename VT> class foo { public: VT & operator [] (int index); private: VT value_; }; extern class foo<int>; extern class foo<double>;#include "foo.h" template <typename VT> VT & foo<VT>::operator [] (int index) { return value_; } class foo<int>; class foo<double>;Auf diese Weise bleibt die Implementation auch geheim.
Hat allerdings den Nachteil, dass dein Template eben auf die explizit instanzierten Spezialisierungen limitiert ist.
-
Was Eisflamme meinte, ist dass man z.B. eine Liste über void* (fast wie in C ) implementieren kann, dann aber ein Template Interface anbietet, um das Benutzen angenehm zu machen.
Ähm, genau, das auch!

Aber eigentlich meinte ich lediglich, dass wenn eine Klasse Y ein Attribut X<int> hat, sodass X ein Klassentemplate ist, Ys Implementierung nicht bekannt sein muss. Nur für den hypothetischen Fall, dass TE annehmen würde, dass ein Template wie eine Seuche alle Verwender in die Publikationspflicht bringt.
-
Die Frage bleibt, was ist der Sinn ?
Was willst du verstecken ?
- schlecht geschriebenen Code ?
- supertolle 10 Zeiler Implementation ?
- dass du selber "code wiederverwertet" hasst ?Egal was deine Intuition ist, es lohnt sich nicht ueber eine "technische" Loesung nachzudenken ^^
Nur ne Anmerkung zu Punkt 2:
Ideen schuetzt Du nicht, indem Du Code versteckst, sondern da wuerden Dir nur Patente helfen ...Templates und code verstecken beisst sich auch irgendwie

Willst du code nicht im klartext ausliefern sondern im compilat verstecken, musst du es compilieren ... und das widerspricht nun mal templates.Ciao ...