1. 程式人生 > 實用技巧 >《C++ Templates》深入模板基礎(一)——模板引數問題(重點待補全)

《C++ Templates》深入模板基礎(一)——模板引數問題(重點待補全)

模板引數的問題:

對於模板引數的使用可以分為三大類:

1.型別引數;

2.非型別引數;

3.模板的模板引數;

針對於型別引數:

其實就是我們所最常使用的類型別,通常在模板引數列表中需要typenmae進行宣告,往往是一個類或者某種型別;

可以說是最常見的一種;

針對於非型別引數:

之前提到過,例如典型的內建型別就是我們所需要的非型別引數;

通常來說,非型別引數往往有以下幾種:

1.整型或者列舉型別;

2.指標型別:函式指標、普通物件指標、指向成員的指標;

3.引用型別:指向物件和函式的引用;

其中值得注意的是,對於非型別引數,我們常見的int是不需要在模板引數列表中加入typename,但是有一些依賴型函式則需要,這個要視情況而定,後面書中第九章會講到這個;

當然函式和陣列型別也可以當成非型別引數,但是其實是編譯器和環境通過隱式轉化而構成,這個需要注意一下;

針對於模板的模板引數:

個人認為這是一種很華而不實的東西,看了這麼多例子也覺得很操蛋,完全可以分開寫;

但是後來細細品了品,發現其實是在為不同的類內初始化做準備;

不妨考慮之前的那個模板的模板引數形式:

template <typename T, template<typename U,typename =std::allocator<U>> class CONT = vector > class A {
private:
	CONT<T,list<int>> A;
};

其中第二個引數模板給定了一個預設引數模板CONT,其中CONT擁有兩大初始化型別,U以及用於分配空間的allocator,其中allocator也採用U進行初始化;

多以可以大致看出,第二個引數模板主要是針對於匹配vector、map、list等STL的的型別,所以其實也是為了已知的型別服務;

所以模板的模板引數個人認為主要是為特殊的類定製化服務,而不是像普通模板進行內建或者函式型別、簡單模板類型別傳參;