C++模板中的函数对象
在C++模板类map中一个参数为Compare类型,该类型为一个比较函数,其完整定义如下:
template<
class Key,
class T,
class Compare = std::less<Key>,
class Allocator = std::allocator<std::pair<const Key, T> >
> class map;
函数作为类进行传递,该类采用了重载操作符()来实现函数指针到类的转变。在实际中也可以仿照此风格写自己的类。
template <typename Key, typename Value, class Hash >
class A {
Hash hash_fn;
public:
A():hash_fn(Hash()) { } size_t hashCode(Key key) { return hash_fn(key);} };
第三个参数Hash为函数对象,该对象通过重载操作符()来实现,其一个字符串类型的Key定义如下:
struct str_hash {
size_t operator()(const std::string& str) const
{
return ;
}
};
当调用hash_fn(key)函数时,该重载函数被调用,这样就实现了转换。由于C++标准库中包含有大量此类型风格的类,我们就可以通过默认参数来调用标准类,这样上面的模板类A就可以定义如下:
template <typename Key, typename Value, class Hash = std::hash<Key>>
测试程序如下:
int main(int argc, char *argv[]) {
A<std::string , int, str_hash> a;
std::cout << "hashCode:" << a.hashCode("abc") << std::endl;
A<std::string,int,std::hash<std::string>> h;
std::cout << h.hashCode("abc") << std::endl;
A<std::string,int> h2;
std::cout << h.hashCode("abc") << std::endl;
return ;
}
测试结果如下:
functiontem
hashCode:
C++模板中的函数对象的更多相关文章
- ThinkPHP第五天(提交类型判定常量IS_POST等,错误页面种类,Model实例化方式,模板中使用函数,foreach循环,模板中.语法配置)
1.IS_GET.IS_POST.IS_PUT.IS_DELETE.IS_AJAX常量,方便快捷实现各个判断. 在Action类中还可以使用$this->isPost()等进行判断. 2.错误页 ...
- Java中的函数对象
初次听说java中的函数对象可能,比较的陌生.可以类比着来理解一下,人们常说java中没有了指针,殊不知,java中的对象引用就是指针,有时候我们说一个对象往往指的就是这个对象的引用,也就是说基本上把 ...
- STL中的函数对象实现负数的定义
// // main.cpp // STL中的函数对象 // // Created by mac on 2019/5/2. // Copyright © 2019年 mac. All rights r ...
- 3.2 STL中的函数对象类模板
*: STL中有一些函数对象类模板,如下所示: 1)例如要求两个double类型的x 和y 的积,可以: multiplies<double>()(x,y); 该表达式的值就是x*y的值. ...
- Thinkphp 模板中直接对数据处理 模板中使用函数 中文字符串截取
1.Thinkphp 模板中直接对数据处理:{$data.name|substr=0,3} 2.中文字符串截取函数:mb_substr=0,14,'utf-8' 3.中文字符串统计:iconv_str ...
- Python中的函数对象与闭包
函数在Python中是第一类对象,可以当做参数传递给其他函数,放在数据结构中,以及作为函数的返回结果. 下面的例子为接受另外一个函数作为输入并调用它 #foo.py def callf(func): ...
- python中的函数对象与闭包函数
函数对象 在python中,一切皆对象,函数也是对象 在python语言中,声明或定义一个函数时,使用语句: def func_name(arg1,arg2,...): func_suite 当执行流 ...
- c++中的函数对象《未完成》
头文件: #pragma once #include<iostream> #include<vector> using namespace std; class Student ...
- 8、泛型程序设计与c++标准模板库5.函数对象
1.函数对象 函数对象是STL提供的第四类主要组件,它使得STL的应用更加灵活方便,从而增强了算法的通用性.大多数STL算法可以用一个函数对象作为参数.所谓“函数对象”其实就是一个行为类似函数的对象, ...
随机推荐
- linux 知识汇总
1 ) linux下文件系统类型的学习 2 )深入理解linux i节点(inode) 3 )RAID系列
- Gradle build设置自动log开关
应用场景 通常情况下我们的apps发布后也就是release模式下log是不显示的,debug模式下是显示log的,但是在特殊情况下我们测试release包的时候需要log的时候,就无法使用Build ...
- JavaScript学习笔记及知识点整理_1
一.js的基础部分 1.==和===的区别:==在判断是否相等的时候会进行类型转换,有时会得到非常奇怪的结果,因此一般情况下都是用===判断是否相等2.strict模式:在js中,如果一个变量没有用v ...
- excel模版从xp复制到win7系统后出现错误 运行时错误 '429' ActiveX 部件不能创建对象
运行时错误 '429' ActiveX 部件不能创建对象Set objDialog = CreateObject("UserAccounts.CommonDialog")解决办法把 ...
- Alpha 和Beta 测试
在正式发布产品之前往往要先发布一些测试版,让用户能够反馈出相关信息,或者找到存在的Bug,以便在正式版中得到解决. 特别是在有客户参加的情况下,对系统进行测试可能会出现一些我们没有考虑的情况,还可以解 ...
- WampServer Version 2.5 bug修改
做PHP开发都需要安装PHP的运行环境,为了方便,网上可以下载到好多的集成环境,最近使用WampServer Version 2.5发现有一些bug,分享一下修改的方法.高手请路过. 1.echo d ...
- android 发短信
SmsManager smsManager = SmsManager.getDefault(); List<String> divideContents = smsManager.divi ...
- 转-浅谈HTTP-GET 、 HTTP-POST 和SOAP
HTTP-GET 和 HTTP-POST HTTP-GET和HTTP-POST是标准协议,他们使用HTTP(超文本传输协议)谓词(谓词是指条件表达式的求值返回真或假的过程.)对参数金星编码并将参数作为 ...
- 读javascript高级程序设计14-错误处理与调试
一 错误类型 ECMA规定了常见的7种错误类型: Error: 基类型.其他常见的错误类型都继承自该类型,一般供开发人员抛出自定义错误. EvalError:该类型会在eval()函数使用异常时被抛 ...
- NodeJS利用mongoose模糊查询MongoDB
在Node.js中,直接硬编码可以 Posts.where('title',/答案/); 但是 通过 字符串构造 不行 var qs = '/'+req.query.search+'/'; Posts ...