這兩天寫了個Dll,要匯出普通類中的模板函式,稍微查了一下,沒查到具體資料。自己根據C++模板的編譯原理,推斷出應該要原始碼放在標頭檔案中直接匯出,查了下接觸的Open Source專案,確實如此。這裡記錄一下,方便下次查閱。
1、宏定義說明:
#ifdef DLL_PROJECT
#define TEMPLATE_IM_EXPORT __declspec(dllexport)
#else
#define TEMPLATE_IM_EXPORT
#endif
#ifdef DLL_PROJECT
#define NORMAL_IM_EXPORT __declspec(dllexport)
#else
#define NORMAL_IM_EXPORT __declspec(dllimport)
#endif
分為普通的匯入匯出宏,和原始碼匯出的情況。
2.標頭檔案
template <typename T> //模板類
class imexdll
{
public:
T addit(T a, T b);
};
//當需要匯出時,需要特例化需要匯出的型別
template class TEMPLATE_IM_EXPORT imexdll<int>;
//模板函式的匯出
template<typename T> int fn1(T t1, T t2);
//需要特化匯出型別
template NORMAL_IM_EXPORT int fn1(int t1, int t2);
//普通函式/類的匯出
NORMAL_IM_EXPORT int fn2(int a, int b);
//普通類中包含模板函式的情況,模板函式機械上src…… 沒查到別的方法
class NORMAL_IM_EXPORT imexdll2
{
public:
template <typename T>
T add(T a, T b)
{
return a + b;
}
};
3.原始檔
#include "imexdll.h"
template <typename T>
T imexdll<T>::addit(T a, T b)
{
T c = a + b;
//cout << "sum:" << c << endl;
return c;
}
template <typename T> int fn1(T t1, T t2)
{
return t1 + t2;
}
int fn2(int a, int b)
{
return a + b;
}
4.為何不擔心普通類中模板函式洩露核心程式碼?
對於模板函式,正常其實現功能都是呼叫模板type 對應下的具體功能,所以只要將具體的type 對應的實現過程封裝好,核心程式碼是不會洩露的。
源自:
https://blog.csdn.net/jerry_yu_1/article/details/120741848