Header-only Template-Bibliothek in eine gemeinsame Bibliothek kompilieren?

8

Wir sind gerade dabei, eine neue C ++ - Bibliothek zu entwerfen, und entschieden uns für einen Vorlagen-basierten Ansatz zusammen mit einigen speziellen Teilvorlagenspezialisierungen für Eckenfälle. Insbesondere wird dies eine Header-only Template-Bibliothek sein.

Nun gibt es Bedenken, dass dies zu einer Menge Code-Duplizierung in den Binärdateien führen wird, da diese Template-Bibliothek in jede andere gemeinsam genutzte Bibliothek oder ausführbare Datei kompiliert wird ( wohl nur die Teile, die benutzt werden). Ich denke immer noch, dass dies kein Problem ist (insbesondere könnte der Compiler sogar Dinge inline machen, die er nicht über Grenzen hinweg teilen konnte).

Da wir jedoch die endliche Menge von Typen kennen, für die dies verwendet wird, gibt es eine Möglichkeit, diesen Header in eine Bibliothek zu kompilieren und einen anderen Header mit nur den Deklarationen und sonst nichts bereitzustellen? / strong> Beachten Sie, dass die Bibliothek nicht nur die generischen Implementierungen, sondern auch die Teilspezialisierungen enthalten muss.

    
lytenyn 08.09.2011, 13:50
quelle

4 Antworten

6

Ja. Was Sie tun können, ist die explizite Instanziierung der Vorlagen in CPP-Dateien unter Verwendung der expliziten Template-Instanziierungssyntax des Compilers. So verwenden Sie die explizite Instanziierung in VC ++: Ссылка . G ++ hat eine ähnliche Funktion: Ссылка .

Beachten Sie, dass C ++ 11 eine Standardsyntax für die explizite Instanziierung einführte, die in [14.7.2] Explizite Instantiierung des FDIS beschrieben wird:

  

Die Syntax für explizite Instanziierung lautet:

     
    

explizite Instanziierung :

         

extern opt template Deklaration

  
    
Daniel Trebbien 08.09.2011, 14:24
quelle
3

C ++ Shared Library mit Vorlagen: Fehler mit nicht definierten Symbolen Einige Antworten decken dieses Thema ab. Um es kurz zu fassen: Es ist möglich, wenn Sie die explizite Instanziierung von Vorlagen im Shared-Library-Code erzwingen. Es wird jedoch eine explizite Spezifikation für alle verwendeten Typen für alle verwendeten Vorlagen auf der Seite der gemeinsam genutzten Bibliotheken erfordern.

    
Mihails Strasuns 08.09.2011 14:18
quelle
1

Wenn es wirklich Vorlagen gibt, dann gibt es keine gemeinsame Bibliothek. Sehen Sie sich verschiedene Boost Projekte für konkrete Beispiele an. Nur wenn Sie keinen Vorlagecode haben, haben Sie eine Bibliothek. Ein konkretes Beispiel ist zB Boost Date_Time und Datumsformatierung und Parsing; Sie können die Bibliothek mit oder ohne diese Funktion und somit mit oder ohne Verknüpfung verwenden.

Keine gemeinsame Bibliothek zu haben ist nett im Sinne von weniger Abhängigkeiten. Der Nachteil ist, dass Ihre Binärdateien etwas größer werden und Sie etwas höhere Kompilierungskosten haben. Aber Speicher ist ziemlich billig (es sei denn, Sie arbeiten in eingebetteten Systemen sind andere besondere Umstände) und das Zusammenstellen ist in der Regel eine einmalige einmalige Kosten.

    
Dirk Eddelbuettel 08.09.2011 13:57
quelle
0

Obwohl es keine Standardmethode gibt, ist dies normalerweise mit implementierungsspezifischen Techniken möglich. Ich habe es vor langer Zeit mit Borlands C ++ Builder gemacht. Die Idee besteht darin, Ihre Vorlagen so zu deklarieren, dass sie aus der gemeinsamen Bibliothek, in der sie sich befinden, exportiert werden und sie dort importieren, wo sie verwendet werden. Die Art, wie ich es gemacht habe, war in diesem Sinne:

%Vor%

Achten Sie darauf, dass ich keinen Zugriff auf den Originalcode habe, damit er Fehler enthält. Dieser Blogeintrag beschreibt einen sehr ähnlichen Ansatz.

Aus Ihrer Formulierung geht hervor, dass Sie nicht unter Windows arbeiten, also müssen Sie herausfinden, ob und wie dieser Ansatz mit Ihrem Compiler übernommen werden kann. Ich hoffe, dies ist genug, um Sie in die richtige Richtung zu lenken.

    
Nicola Musatti 08.09.2011 15:11
quelle

Tags und Links