簡體   English   中英

在C ++中分離模板接口和實現

[英]Separating template interface and implementation in C++

這是一個后續問題: 將export關鍵字與模板一起使用

正如在原始問題的答案中所提到的,'export'在C ++ 0x中已被棄用,即使對於C ++ 03也很少得到編譯器的支持。 鑒於這種情況,可以用什么方式隱藏lib文件中的實際實現,只是通過頭文件公開聲明,以便最終用戶可以知道公開的API的簽名是什么,但是無法訪問實現相同的源代碼?

在實踐中你不能。

只有當您擁有一組特殊化時,才能將它們放入庫中。 基本模板不能放在那里。

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

總之,你不能。 export關鍵字是嘗試實現類似於非源模板庫的嘗試失敗(盡管甚至沒有接近二進制代碼實現的混淆程度),並且沒有替代。

我經常注意到的一件事是,很多模板代碼實際上並不是模板,可以移動到非模板函數。

還發生函數模板特化被視為常規函數:您可以將它們內聯定義(並將其標記)或在頭中聲明它們並在源文件中實現它們。

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

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

模板的目標是創建“模式”,以便編譯器可以為多種不相關的類型生成類和函數。 如果隱藏此模式,您希望編譯器如何能夠生成這些類和函數?

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

但是,它不完美,因為它只限制模板實例化。 我們的想法是將模板聲明和實現分成兩個單獨的文件。

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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM