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. 混淆实现
不能隐藏,必须在头文件中完全定义类模板。您只能通过使用多层头文件并使用辅助类名和辅助函数名来混淆实现,辅助函数名是最高级别用户可见类的混淆。
2. 模板特化
如果仅将其用于某些特定类型,则可以隐藏它。在这种情况下,您可以执行显式实例化,导出模板并在.cpp中实现它。尝试将其与任何其他类型一起使用将不会链接。
//-----------------------------------------------------------------------------------------------
// 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();
}
网友评论