std::function
2015-07-24 16:14
197 查看
原文地址:http://www.hankcs.com/program/cpp/c11-std-function-usage.html
码农场 » C++11
std::function用法
在看Cocos2d-x的范例代码时,随处可见“很奇怪”的语法:
其中CL是一个宏,对应如下lambda表达式:
还算好懂,感觉是个工厂模式,同时用宏模拟了接口。
但是这个std::function<Layer*()>却让我少见多怪了,翻开第五版《C++ Primer》,才知道原来是C++11的新特性——可调用对象模板类。一句话说明问题,std::function<Layer*()>代表一个可调用对象,接收0个参数,返回Layer*。
至于function的深入理解,还是用代码说明吧。
如上所示,function可以将普通函数,lambda表达式和函数对象类统一起来。它们并不是相同的类型,然而通过function模板类,可以转化为相同类型的对象(function对象),从而放入一个map里。
另外我实际测试的结果来看,在VS2013编译器下,上述代码可以通过,而第五版《C++ Primer》第512页第一行所言“错误:mod不是一个函数指针”并没有发生错误。
书上说的是,当你将map容器定义为 map<string, int(*)(int, int)> binops;时,会无法存入mod,因为mod是一个lambda表达式。
而你定义的是 map<char, function<int(int, int)> > binops; 自然编译器不会报错。
码农场 » C++11
std::function用法
在看Cocos2d-x的范例代码时,随处可见“很奇怪”的语法:
但是这个std::function<Layer*()>却让我少见多怪了,翻开第五版《C++ Primer》,才知道原来是C++11的新特性——可调用对象模板类。一句话说明问题,std::function<Layer*()>代表一个可调用对象,接收0个参数,返回Layer*。
至于function的深入理解,还是用代码说明吧。
另外我实际测试的结果来看,在VS2013编译器下,上述代码可以通过,而第五版《C++ Primer》第512页第一行所言“错误:mod不是一个函数指针”并没有发生错误。
书上说的是,当你将map容器定义为 map<string, int(*)(int, int)> binops;时,会无法存入mod,因为mod是一个lambda表达式。
而你定义的是 map<char, function<int(int, int)> > binops; 自然编译器不会报错。
相关文章推荐
- HDU 2824 The Euler function(欧拉函数)
- HDU 3501 Calculation 2(欧拉函数)
- 通过Handler与线程嵌套TimerTask实现循环交替任务
- JAVASCRIPT实现翻页保存已勾选的项目
- 通过Handler与线程嵌套TimerTask实现循环交替任务 分类: Android 2015-07-24 16:14 162人阅读 评论(0) 收藏
- UVA 10869 - Brownie Points II(树阵)
- 服务器端开发技术
- C++获取系统时间如何插入到MySQL里面的datetime型属性中
- Web服务器虚拟目录
- 典型关联分析(CCA)算法原理
- Spring @Transaction配置示例及发生不回滚原因深度剖析
- 线段覆盖
- hdu5289 2015多校联合第一场1002 Assignment
- Permutations
- HDU 2602 Bone Collector (01背包)
- 推荐方法和评价指标体系
- 感谢及建议(网友留言)
- [MySQL] gap lock/next-key lock浅析
- resteasy入门
- 个人信息发布平台