C++使用模板并隐藏实现

来源:互联网 发布:网络教育考公务员 编辑:程序博客网 时间:2024/06/15 16:10

我们在用C++模板的时候,通常要把实现写在头文件里,如果项目中模版很多的时候,会造成编译速度很慢,如果你用过boost的话,你就深有体会了。

为了使用模板并隐藏实现从而加快编译速度,或者是其他的一些不可告人的目的(我怎么能拿这么黑暗的思想揣摩程序员)。

这里介绍一个好方法,是借鉴了PCL(point cloud library)中的实现。

template_export_class工程


template_define.h//头文件

#pragma once//比较low的写法,懒得改了

template<class T>
class Calcuate//计算类,这里只有声明
{
public:
Calcuate();
virtual ~Calcuate();
T add(T lhs, T rhs);
private:
T a, b;
};


template_export_class.cpp//源文件

#include "template_define.h"
#include "export.h"

template<class T>
Calcuate<T>::Calcuate()
{


}

template<class T>
Calcuate<T>::~Calcuate()
{


}

template<class T>
T Calcuate<T>::add(T lhs, T rhs)
{
return lhs + rhs;
}

注意,如果你这样写了,被其他库引用的时候必然会报链接错误,这时就需要模板特化并导出了


#define INSTANTIATE(T) template class TEMPLATE_EXPORT Calcuate<T>;
INSTANTIATE(int)
INSTANTIATE(float)
INSTANTIATE(double)


TEMPLATE_EXPORT是导出宏

#ifdef  TEMPLATE_EXPORT_CLASS_EXPORTS
#define TEMPLATE_EXPORT __declspec(dllexport)
#else
#define TEMPLATE_EXPORT __declspec(dllimport)
#endif

不会的面壁去


这时其他库引用就没有问题了

template_export_test工程


main.cpp//测试代码

#include "..\template_export_class\template_define.h"
#include <iostream>


int main()
{
Calcuate<int> cal;
int x = cal.add(1, 2);
std::cout << x << std::endl;


Calcuate<float> cal2;
float x2 = cal2.add(1.0f, 3.0f);
std::cout << x2 << std::endl;
}


当然这里只特化了int, float, double三个类型,其他类型就报错了,因为其他类型并没有被导出



0 0