您的位置:首页 > 其它

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; 自然编译器不会报错。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: