模闆類
模闆類的定義使用
template<typename T>
或
template<class T>
,将具有相同功能的代碼合并,增加代碼的簡潔性和易讀性。例如在計算凸包的例子中,傳入點的類型可以是自定義的
Point
,也可以是
pcl::point
之類。
例如在頭檔案中的定義如下:
template<typename T>
class POLYGON
{
public:
POLYGON();
public:
void convhull(std::vector<T> &input, std::vector<T> &result);
};
模闆函數
如模闆類中的
convhull
函數就是模闆函數,模闆函數的輸入為各種類型的點,将計算後的凸包存在
result
中。
convhull
的模闆參數隻有T,也可以為該函數增加其它的模闆參數。例如,增加參數
T1
:
template<typename T>
class POLYGON
{
public:
POLYGON();
template<typename T1> void test(T1 a);
public:
void convhull(std::vector<T> &input, std::vector<T> &result);
};
以上為模闆類和模闆函數是如何定義的,接下來将介紹它們是如何初始化的。模闆函數有隐式執行個體化和顯示執行個體化,但模闆類隻有顯式執行個體化。
1、隐式執行個體化
在模闆函數的初始化在類的内部,即函數的實作在類的内部,例如實作
pointFromVeh2grd
,在調用隐式執行個體化的模闆函數時,系統會自動适配模闆參數T。
template<typename T>
class POLYGON
{
public:
POLYGON();
T pointFromVeh2grd(const T &ptVeh, const double &vehX, const double &vehY, const float &vehYaw){
return ptGrd;
}
template<typename T1> void test(T1 a);
public:
void convhull(std::vector<T> &input, std::vector<T> &result);
};
2、顯示初始化
模闆函數的初始化在類的外部,模闆類執行個體化
AXIS_CONVERT<int>
,這說明
AXIS_CONVERT
類隻接受int類型的輸入,如果輸入類型,編譯器會報錯。模闆函數執行個體化
template void AXIS_CONVERT::test<double>(double);
同樣
test
函數隻接受
double
類型的輸入。
//在源檔案中進行顯式初始化及實作
//顯式初始化
template class AXIS_CONVERT<int>;
template void AXIS_CONVERT::test<double>(double);
//函數功能實作
template<typename T> template<typename T1>
void AXIS_CONVERT<T>::test(T a)
{
std::cout<<a<<std::endl;
}