https://stackoverflow.com/questions/30131808/is-it-possible-to-hide-implementation-of-template-class
https://blog.csdn.net/qingcaichongchong/article/details/50914465?utm_source=blogxgwz9
https://stackoverflow.com/questions/5869479/how-to-hide-an-implementation-helper-template
1. 混淆實現(xiàn)
不能隱藏,必須在頭文件中完全定義類模板弓颈。您只能通過使用多層頭文件并使用輔助類名和輔助函數(shù)名來混淆實現(xiàn),輔助函數(shù)名是最高級別用戶可見類的混淆。
2. 模板特化
如果僅將其用于某些特定類型庄萎,則可以隱藏它俺夕。在這種情況下契耿,您可以執(zhí)行顯式實例化,導出模板并在.cpp中實現(xiàn)它拣度。嘗試將其與任何其他類型一起使用將不會鏈接。
//-----------------------------------------------------------------------------------------------
// Calculate.h
// 計算類
//-----------------------------------------------------------------------------------------------
?
?
#ifndef __CALCULATE_H__
#define __CALCULATE_H__
?
?
template <typename T>
class Calcuate
{
public:
Calcuate<T>();
virtual ~Calcuate<T>();
T add(T lhs, T rhs);
};
?
?
// 導出宏
#ifdef TEMPLATE_EXPORT_CLASS_EXPORTS
#define TEMPLATE_EXPORT __declspec(dllexport)
#else
#define TEMPLATE_EXPORT __declspec(dllimport)
#endif
?
?
// 模板特化
#define INSTANTIATE(T) template class TEMPLATE_EXPORT Calcuate<T>;
INSTANTIATE(int)
INSTANTIATE(float)
INSTANTIATE(double)
?
?
#endif
//-----------------------------------------------------------------------------------------------
// Calculate.cpp
// 計算類
//-----------------------------------------------------------------------------------------------
?
?
#include "../Include/Calculate.h"
?
?
template<class T>
Calcuate<T>::Calcuate()
{
?
?
}
?
template<class T>
Calcuate<T>::~Calcuate<T>()
{
?
?
}
?
template<class T>
T Calcuate<T>::add(T lhs, T rhs)
{
return lhs + rhs;
}
// TemplateSourceHide.cpp : 定義控制臺應用程序的入口點螃壤。
//
?
#include "stdafx.h"
?
?
#include <iostream>
?
#include "Include/Calculate.h"
?
?
int main()
{
Calcuate<int> ins;
auto result1 = ins.add(3, 5);
std::cout << "Result = " << result1 << std::endl;
?
getchar();
}