仿函数和模版的模板参数
2016-04-06 16:31
148 查看
类型萃取被整理到STL迭代器剖析里卖了!!在那里面说的更清楚!
模版的模板参数主要使用在类的类成员也是个模板类,当你想只输入一个模板参数,就可以同时对类内的其他类成员传入相同的模板参数的时候就可以使用咯
这个就是模板的模版参数的一个简单实现,用来实现类的类成员和该类模板使用类型一致的方法
那什么是仿函数呢,仿函数是STL库中经常使用的一种手法
[align=left]仿函数可以通过结构体内部定义一些operator()实现一种类似函数的方法,通过模板传参就可以使用,仿函数并不是真正的函数,是通过模板和结构体(或者是类)实现的,类似函数的体制,仿函数可以用在代码的重用上,可以减少冗余的部分代码,例如可以将比较大小整合成一个仿函数,在使用的时候就可以省去很多代码[/align]
这里贴出我写的哈希表的部分代码,这里就是用了仿函数,目的是处理不同的结构,当哈希表存入的是int类型,和当哈希表存入的是string类型时,调用的仿函数是不同的(我对仿函数的模板进行了特化),下边贴一下调用仿函数的代码
size_t HashFuner(const K& key,size_t capacity)
{
3 return HashFun()(key, capacity);
}
因为HashFun是一个结构体,所以构造一个匿名变量调用operator()方法,再进行封装
这样看起来就跟函数差不多了,不是么
模版的模板参数主要使用在类的类成员也是个模板类,当你想只输入一个模板参数,就可以同时对类内的其他类成员传入相同的模板参数的时候就可以使用咯
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库中经常使用的一种手法
[align=left]仿函数可以通过结构体内部定义一些operator()实现一种类似函数的方法,通过模板传参就可以使用,仿函数并不是真正的函数,是通过模板和结构体(或者是类)实现的,类似函数的体制,仿函数可以用在代码的重用上,可以减少冗余的部分代码,例如可以将比较大小整合成一个仿函数,在使用的时候就可以省去很多代码[/align]
template<class K> struct HashFuncer { size_t operator()(const K& key,size_t capacity) { return key%capacity; } }; template<> struct HashFuncer<string> { static size_t BKDRHash(const char *s) { unsigned int seed = 131; unsigned hash = 0; while (*s) { hash = hash*seed + (*s++); } return (hash & 0x7FFFFFFF);//八成是想取个正数 } size_t operator()(const string &key, size_t _capacity) { return BKDRHash(key.c_str())%_capacity; } }; template<class K,class V,class HashFun=HashFuncer<K>> class HashTable { };
这里贴出我写的哈希表的部分代码,这里就是用了仿函数,目的是处理不同的结构,当哈希表存入的是int类型,和当哈希表存入的是string类型时,调用的仿函数是不同的(我对仿函数的模板进行了特化),下边贴一下调用仿函数的代码
size_t HashFuner(const K& key,size_t capacity)
{
3 return HashFun()(key, capacity);
}
因为HashFun是一个结构体,所以构造一个匿名变量调用operator()方法,再进行封装
这样看起来就跟函数差不多了,不是么
相关文章推荐
- cocos2d 在ios上设置横竖屏
- JS 数组去重
- 【LeetCode-239】Sliding Window Maximum
- Android 之 Animation
- 当uitextview 或uitextfield 含有 表情符号 emoji 时 使用 NSMakeRange 可能会出现得异常!
- LintCode_175_翻转二叉树
- 第六周书面项目(2):程序的理解
- 如何解决ul无法撑开div高度的情况
- 公理系统与有限几何(2)
- 我的NopCommerce之旅(6): 应用启动
- 有趣的sql
- 使用系统的照相机和录像机
- yaml文件
- EL表达式获取地址栏地址以及jsp如何获取服务器信息
- nodejs之promise书写规范
- caffe中对6种激活函数类的封装--TanH
- EL表达式获取地址栏地址以及jsp如何获取服务器信息
- nyoj 35 表达式求值
- 双亲委派模型
- UGUI-Canvas