天天看點

C++之模闆類&模闆函數

模闆類

模闆類的定義使用

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;

}
           

繼續閱讀