2014-09-03 24 views
5

Tworzymy zestaw bibliotek z publicznym interfejsem API, który ma być używany przez różne strony trzecie. Niektóre biblioteki są czyste C, więc oczywiście mają nagłówek w stylu C z funkcjami i definicjami struct i odpowiednią biblioteką. Oni są w porządku.Jak publikować pliki nagłówkowe z implementacjami szablonów?

Niektóre z bibliotek są napisane przy użyciu umiarkowanie złożonego C++ (kierującego na starsze kompilatory), więc wprowadziliśmy pewną formę słynnego idiomu pimpl. To też jest w porządku.

Z drugiej strony znaczna część plików nagłówkowych to C++ z użyciem silnie szablonowego kodu. Znając Why can templates only be implemented in the header file?, ale także nie chcąc ujawniać zbyt wielu szczegółów dotyczących implementacji oczom, które nie powinny ich widzieć, intensywnie je refaktoryzowaliśmy, aby wykluczyć jak najwięcej szczegółów wewnętrznych i mieć tylko naprawdę potrzebne fragmenty ... i nadal jest znaczący ilość kodu pozostała.

To mnie zastanawia: czy istnieje preferowany sposób dystrybucji plików nagłówkowych, które w dużej mierze zawierają szablony? Jakie są dobre praktyki, najlepsze podejścia i wskazówki i porady?

+2

Nie sądzę, że istnieje solidne leczenie w tej kwestii. – 101010

Odpowiedz

4

Przejrzyj swoje pliki nagłówkowe kompilatora C++, aby uzyskać inspirację. Standardowa biblioteka C++ jest pełna szablonów i generalnie znajdziesz cały kod szablonu w nagłówkach.

Powiedziawszy, że jeśli określone szablony mają być używane z niewielką liczbą możliwych klas (lub wartości) jako parametrów szablonu, istnieje możliwość jawnego utworzenia instancji szablonów wewnątrz samej biblioteki, pozostawiając tylko nagi szablon deklaracje widoczne w plikach nagłówkowych.

Korzystanie prostszy pre-C++ 11 scenariusz jako przykład, C++ biblioteka zazwyczaj zapewnić realizację std::basic_string tylko przez std::basic_string<char> i std::basic_string<wchar_t>; i pozostawić garść kodu szablonu wewnątrz samej biblioteki, z widoczną tylko deklaracją szablonu std::basic_string widoczną w plikach nagłówkowych.

Powiązane problemy