高洛峰2017-04-17 13:57:13
一個不完美的解決辦法,明確實例化。
例如
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);
templ.cpp
#include "templ.h"
template <typename T>
T max (T const& lhs, T const& rhs)
{
return lhs > rhs ? lhs : rhs;
}
但是鮮有編譯器實作這個功能,而且C++11標準中export已經沒有這個功能了。
對於模板的實作程式碼,連微軟都是開源的,所以應該是沒有啥完美的解決方案了。
高洛峰2017-04-17 13:57:13
如果只有模板,我認為是不可能的,沒看過這種純模板封裝在dll裡面的範例,模板不是普通的c++程式碼。 。
如果自己的演算法不想暴露實現,那麼唯一的方式就是做成動態庫或者靜態庫以及模板代碼兩部分,即一部分重要實現搞到庫中,不重要的放在模板裡面,有點像boost那樣子。 。