2011-03-24 24 views
10

這是一個後續問題: Using export keyword with templates分離模板接口和實現在C++

正如原題「出口」的答案中提到已被棄用C++ 0x中,很少由編譯器甚至支持C++ 03。鑑於這種情況,人們可以通過什麼方式隱藏lib文件中的實際實現,並通過頭文件公開聲明,以便最終用戶可以知道公開的API的簽名,但無法訪問實現相同的源代碼?

回答

7

實際上你不能。

只有當你有一組特定的專業化,你可以把它們放在一個庫中。基本模板不能放在那裏。

另一方面,使用導出沒有隱藏源代碼。編譯器仍然需要它從模板實例化新的類。

+1

也可以只聲明基本模板,在這種情況下,使用未提供專門化的類型實例化是不可能的。 – 2011-03-24 10:15:56

+0

某些專業化基本上是指每種情況下的特殊功能(類似於任何API ......不使用模板的功能)。 – 2011-03-27 16:24:32

+0

Matthieu M:這是否意味着如果我正在使用模板進行開發,我必須將所有開發的源代碼公開給用戶(閱讀第三方)。 Theres沒有辦法強制知識產權? – 2011-03-27 16:27:01

2

總之,你不能。關鍵字export是一個嘗試實現類似於非源代碼模板庫的嘗試失敗的嘗試(儘管甚至沒有達到二進制代碼實現的混淆級別),並且在關閉時沒有替換。

1

我經常注意到的一件事情是模板代碼的一大塊很不實際,所以可以將其移動到非模板函數中。

函數模板特化也被認爲是常規函數:您可以將它們定義爲內聯(並將它們標記爲)或將它們聲明爲標題並在源文件中實現它們。

當然,專業化意味着你知道哪種類型將被執行...

注意,你所要求的是有些對立。

模板的目標是創建一個「模式」,以便編譯器可以爲多個不相關的類型生成類和函數。如果你隱藏這種模式,你期望編譯器能夠生成這些類和函數嗎?

1

您可以在最近的編譯器使用的extern模板:http://en.wikipedia.org/wiki/C%2B%2B0x#Extern_template

然而,這是不完美的,因爲它只能限制模板實例。這個想法是你在兩個獨立的文件中分開模板聲明和實現。

然後,當您需要該模板時,首先使用extern模板,以確保它尚未實例化。然後,對於每個需要的實例(一個用於std :: vector,一個用於std :: vector等),將該實例放入一個將在獨特cpp中的typedef。

因爲它使代碼顯然難以理解,所以它不是最好的解決方案。但它確實有效:它有助於最小化模板實例化。