仿函数和模版的模板参数
类型萃取被整理到STL迭代器剖析里卖了!!在那里面说的更清楚!
模版的模板参数主要使用在类的类成员也是个模板类,当你想只输入一个模板参数,就可以同时对类内的其他类成员传入相同的模板参数的时候就可以使用咯
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()方法,再进行封装
这样看起来就跟函数差不多了,不是么