商业的C++模板代码怎么才能不暴露实现?
伊谢尔伦
伊谢尔伦 2017-04-17 13:55:13
0
3
580
伊谢尔伦
伊谢尔伦

小伙看你根骨奇佳,潜力无限,来学PHP伐。

全部回覆(3)
小葫芦

一個不完美的解決辦法,明確實例化。
例如

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已經沒有這個功能了。

對於模板的實作程式碼,連微軟都是開源的,所以應該是沒有啥完美的解決方案了。

小葫芦

如果只有模板,我認為是不可能的,沒看過這種純模板封裝在dll裡面的範例,模板不是普通的c++程式碼。 。
如果自己的演算法不想暴露實現,那麼唯一的方式就是做成動態庫或者靜態庫以及模板代碼兩部分,即一部分重要實現搞到庫中,不重要的放在模板裡面,有點像boost那樣子。 。

大家讲道理

模板基本上做不到了,大部分編譯器不支援export關鍵字

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!