84669 人學習
152542 人學習
20005 人學習
5487 人學習
7821 人學習
359900 人學習
3350 人學習
180660 人學習
48569 人學習
18603 人學習
40936 人學習
1549 人學習
1183 人學習
32909 人學習
小伙看你根骨奇佳,潜力无限,来学PHP伐。
一個不完美的解決辦法,明確實例化。 例如
templ.h 中
template <typename T> T max (T const& lhs, T const& rhs);
templ.cpp
#include "templ.h" template <typename T> T max (T const& lhs, T const& rhs) { return lhs > rhs ? lhs : rhs; } int max (int const& lhs, int const& rhs); double max (double const& lhs, double const& rhs); string max (string const& lhs, string const& rhs); //...
這樣cpp中範本被明確實例化後就不會在連結階段失敗,好處是cpp實作不會暴露給客戶,只要提供頭檔和函式庫檔案。 但限制在於模板的支援的類型是有限的,用戶有新增的類型就不支援了。
C++98標準有export關鍵字來實現模板的宣告和實作分離。 即:templ.h 中
export template <typename T> T max (T const& lhs, T const& rhs);
#include "templ.h" template <typename T> T max (T const& lhs, T const& rhs) { return lhs > rhs ? lhs : rhs; }
但是鮮有編譯器實作這個功能,而且C++11標準中export已經沒有這個功能了。
對於模板的實作程式碼,連微軟都是開源的,所以應該是沒有啥完美的解決方案了。
如果只有模板,我認為是不可能的,沒看過這種純模板封裝在dll裡面的範例,模板不是普通的c++程式碼。 。 如果自己的演算法不想暴露實現,那麼唯一的方式就是做成動態庫或者靜態庫以及模板代碼兩部分,即一部分重要實現搞到庫中,不重要的放在模板裡面,有點像boost那樣子。 。
模板基本上做不到了,大部分編譯器不支援export關鍵字
一個不完美的解決辦法,明確實例化。
例如
templ.h 中
templ.cpp
這樣cpp中範本被明確實例化後就不會在連結階段失敗,好處是cpp實作不會暴露給客戶,只要提供頭檔和函式庫檔案。
但限制在於模板的支援的類型是有限的,用戶有新增的類型就不支援了。
C++98標準有export關鍵字來實現模板的宣告和實作分離。
即:
templ.h 中
templ.cpp
但是鮮有編譯器實作這個功能,而且C++11標準中export已經沒有這個功能了。
對於模板的實作程式碼,連微軟都是開源的,所以應該是沒有啥完美的解決方案了。
如果只有模板,我認為是不可能的,沒看過這種純模板封裝在dll裡面的範例,模板不是普通的c++程式碼。 。
如果自己的演算法不想暴露實現,那麼唯一的方式就是做成動態庫或者靜態庫以及模板代碼兩部分,即一部分重要實現搞到庫中,不重要的放在模板裡面,有點像boost那樣子。 。
模板基本上做不到了,大部分編譯器不支援export關鍵字