2014-09-03 22 views
5

Stiamo creando un set di librerie con un'API pubblica che deve essere utilizzata da terze parti diverse. Alcune librerie sono pure C, quindi ovviamente hanno un'intestazione in stile C con funzioni e definizioni struct e la libreria corrispondente. Loro sono ok.Come pubblicare i file di intestazione con le implementazioni dei modelli?

Alcune librerie sono scritte con l'uso di un C++ moderatamente complesso (rivolto ai compilatori più vecchi), quindi abbiamo implementato alcune forme del famoso idioma di Pimpl. Va bene anche questo.

Dall'altra parte una parte significativa dei file di intestazione è C++ utilizzando codice fortemente basato su modelli. Conoscendo il Why can templates only be implemented in the header file? ma anche non volendo rivelare troppi dettagli di implementazione agli occhi che non dovrebbero vederli, li abbiamo fortemente refactored per escludere quanti più dettagli interni possibili e avere solo i bit veramente necessari ... e c'è ancora un significativo quantità di codice rimanente.

Quindi mi imbarazza: c'è un modo preferito di distribuire i file di intestazione che in gran parte contengono modelli? Quali buone pratiche, migliori approcci e trucchi e suggerimenti ci sono?

+2

Non penso che ci sia un trattamento robusto su questo problema. – 101010

risposta

4

Guarda i file di intestazione del tuo compilatore C++, per un'ispirazione. La libreria standard di C++ è piena di modelli e generalmente troverai tutto il codice del modello nelle intestazioni.

Detto questo, se i modelli specifici devono essere utilizzati con un numero limitato di possibili classi (o valori) come parametri del modello, si ha un'opzione di istanziazione esplicita di modelli all'interno della libreria stessa, lasciando solo il modello nudo dichiarazioni visibili nei file di intestazione.

Utilizzando uno scenario pre-C++ 11 più semplice come esempio, una libreria C++ fornirà in genere un'implementazione std::basic_string per un solo std::basic_string<char> e std::basic_string<wchar_t>; e lascia un mucchio di codice template all'interno della libreria stessa, con una semplice dichiarazione modello std::basic_string visibile nei file di intestazione.