首頁  >  問答  >  主體

商业的C++模板代码怎么才能不暴露实现?

伊谢尔伦伊谢尔伦2765 天前587

全部回覆(3)我來回復

  • 高洛峰

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

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

    回覆
    0
  • 高洛峰

    高洛峰2017-04-17 13:57:13

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

    回覆
    0
  • 大家讲道理

    大家讲道理2017-04-17 13:57:13

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

    回覆
    0
  • 取消回覆