之後我在整理之後會把類型萃取也放著這個文章裡面,我自己還是滿容易混淆的,經常分不清、
模版的模板參數主要使用在類的類成員也是個模板類,當你想只輸入一個模板參數,就可以同時對類內的其他類成員傳入相同的模板參數的時候就可以使用咯
1 #include<iostream> 2 3 using namespace std; 4 5 6 7 template<class T> 8 class class1 9 { 10 T a; 11 }; 12 13 template < class T, template< class> class class1 > 14 class class2 15 { 16 T b; 17 class1<T> c; 18 };
這個就是模板的模版參數的一個簡單實現,用來實現類的類成員和該類模板使用類型一致的方法
那什麼是仿函數呢,仿函數是STL庫中經常使用的一種手法
仿函數可以通過結構體內部定義一些operator()實現一種類似函數的方法,通過模板傳參就可以使用,仿函數並不是真正的函數,是通過模板和結構體(或者是類)實現的,類似函數的體制,仿函數可以用在代碼的重用上,可以減少冗余的部分代碼,例如可以將比較大小整合成一個仿函數,在使用的時候就可以省去很多代碼1 template<class K> 2 struct HashFuncer 3 { 4 size_t operator()(const K& key,size_t capacity) 5 { 6 return key%capacity; 7 } 8 }; 9 10 template<> 11 struct HashFuncer<string> 12 { 13 static size_t BKDRHash(const char *s) 14 { 15 unsigned int seed = 131; 16 unsigned hash = 0; 17 while (*s) 18 { 19 hash = hash*seed + (*s++); 20 21 } 22 return (hash & 0x7FFFFFFF);//八成是想取個正數 23 } 24 size_t operator()(const string &key, size_t _capacity) 25 { 26 return BKDRHash(key.c_str())%_capacity; 27 } 28 }; 29 30 31 32 33 34 template<class K,class V,class HashFun=HashFuncer<K>> 35 class HashTable 36 { 37 };
這裡貼出我寫的哈希表的部分代碼,這裡就是用了仿函數,目的是處理不同的結構,當哈希表存入的是int類型,和當哈希表存入的是string類型時,調用的仿函數是不同的(我對仿函數的模板進行了特化),下邊貼一下調用仿函數的代碼
1 size_t HashFuner(const K& key,size_t capacity)
2 {
3 return HashFun()(key, capacity);
4 }
因為HashFun是一個結構體,所以構造一個匿名變量調用operator()方法,再進行封裝
這樣看起來就跟函數差不多了,不是麼