c++11之特性之std::function(书:深入应用c++11)
std::function和std::bind可以让标准函数的使用更方便,也可以实现延迟求值。
1.可调用对象
1.1函数指针
1.2具有operator()成员函数的类对象(仿函数,重载()符号类的对象)
1.3可以被转换为函数指针的类对象
1.4类成员函数指针,类成员指针
void func(void)
{...
}struct Foo
{void operator() (void){...}
};struct Eoo
{using fr = void(*)(void);static void func(void){...}operator fr(){return func;}
};
struct Goo
{int a;void mem_func(void){...}
};int main()
{void (* func_ptr) (void) = &func; // 函数指针func_ptr(); // 调用函数指针Foo foo; // 仿函数foo(); // 调用仿函数Eoo eoo; // 可被转换为函数指针的类对象eoo(); // 调用类对象void (Goo::*mem_func_ptr)(void) = &Goo::mem_func;// 类成员函数指针int Goo::*men_obj_ptr = &Goo::a; // 类成员指针Goo goo;(goo.*men_func_ptr)(); // 调用类成员函数指针goo.*men_obj_ptr = 123; // 调用类成员指针return 0;
}
2.定义:
std::function是可调用对象的包装器。是一个类模板,可以容纳除了类成员函数指针、类成员指针以外的所有可调用对象。
3.使用方式:
当给std::function填入合适的函数签名int(int),它就变成一个可以容纳此类型调用方式的“函数包装器”。
#include <iostream>
#include <functional>void func()
{std::cout << __FUNCTION__ << std::endl;
}
class Foo
{
public:static int foo_func(int a){std::cout << __FUNCTION__ << "("<< a << ")->";return a;}private:};
class Bar
{
public:int operator()(int a){std::cout << __FUNCTION__ << "(" << a << ")->";return a;}
private:};int main() {std::function<void(void)> fr1 = func; // 函数指针fr1();std::function<int(int)> fr2 = Foo::foo_func; // 类静态函数std::cout << fr2(123) << std::endl;Bar bar;std::function<int(int)> fr3 = bar; // 重载()运算符的类对象std::cout << fr3(456) << std::endl;return 0;
}
函数指针的调用,取代了函数指针
#include <iostream>
#include <functional>class MyClass
{std::function<void()> callbackMy;
public:MyClass(const std::function<void()> &f):callbackMy(f){}void Notify(){callbackMy(); // 注意,此处一定带有()才是真的调用。}
};class Bar
{
public:void operator()(){std::cout << __FUNCTION__ << std::endl;}};int main() {Bar bar;MyClass my(bar);my.Notify();return 0;
}
函数入参
#include <iostream>
#include <functional>void call_when_event(int x, const std::function<void(int)> &f)
{if ( x% 2 == 0){f(x);}
}void output(int x)
{std::cout << x << std::endl;
}
int main() {for (int i = 1; i < 10 ; ++i){call_when_event(i,output);}return 0;
}
c++11之特性之std::function(书:深入应用c++11)相关推荐
- C++11新特性之std::function std::bind
std::function 在c++98&03时我们通常使用回调函数来处理一些需要某种场景下才触发的回调操作,但回调函数有一个限制就是它只能赋值给同类型的全局或者静态函数,对于其他有相同的返回 ...
- C++11新特性之std::function<>
转自http://www.jellythink.com/archives/771 看下面这两行代码: std::function<void(EventKeyboard::KeyCode, Eve ...
- C++11 新特性之std::thread
C++11 新特性之std::thread 原文:https://blog.csdn.net/oyoung_2012/article/details/78958274 从C++11开始,C++标准库已 ...
- C++11新特性以及std::thread多线程编程
一 .C++11新特性 1. auto 类型推导 1.1 当=号右边的表达式是一个引用类型时,auto会把引用抛弃,直接推导出原始类型: 1.2 当=号右边的表达式带有const属性时,auto不会使 ...
- C++11新特性之std::bind()
文章转载自:http://www.jellythink.com/archives/773 Cocos2d-x中有如下代码: // new callbacks based on C++11#define ...
- C++11 FAQ中文版:std::function 和 std::bind
std::function 和 std::bind 标准库函数bind()和function()定义于头文件中(该头文件还包括许多其他函数对象),用于处理函数及函数参数.bind()接受一个函数(或者 ...
- C++11新特性之 std::forward(完美转发)
上篇博客对右值.右值引用都做了简要介绍. 我们也要时刻清醒,有时候右值会转为左值,左值会转为右值. (也许"转换"二字用的不是很准确) 如果我们要避免这种转换呢? 我们需要一种方法 ...
- 【C++】C++11新特性——可变参数模板|function|bind
文章目录 一.可变参数模板 1.1 可变参数的函数模板 1.2 递归函数方式展开参数包 1.3 逗号表达式展开参数包 1.4 empalce相关接口函数 二.包装器function 2.1 funct ...
- C++11新特性之std::advance函数
将某个迭代器前进到指定的位置上,例如: // advance example #include <iostream> // std::cout #include <iterator& ...
最新文章
- 从Storm和Spark 学习流式实时分布式计算的设计
- 封装CoreGraphics的API简化绘图操作
- 21.单链表怎么就地逆序?
- Visual Studio.NET
- 【MRCTF—Web】做题+复现记录
- python字符串的冒泡排序_如何实现python冒泡排序算法?
- SummerBoot,将SpringBoot的先进理念与C#的简洁优雅合二为一
- java创建链表成绩管理系统_成绩管理系统 链表版
- Linux入门-第四周
- js 设置div超出宽度隐藏_【CSS/JS】如何实现单行/多行文本溢出的省略(...)--绕过坑道的正确姿势...
- 迅雷方舟与花瓣:不一样的“瀑布流”
- 手写文字怎么识别,手写文字识别的方法
- 身体好比什么都强 [唱片]
- 有一群海盗(不多于20人),在船上比拼酒量。过程如下:打开一瓶酒,所有在场的人平分喝下, 有几个人倒下了。再打开一瓶酒平分,又有倒下的,再次重复...... 直到开了第4瓶酒,坐着的已经所剩无
- 2020 软件测试行业问卷调查结果分析
- Lucene 和 Kibana、ElasticSeach、Spring Data ElasticSearch
- 浅析语音识别技术的工作原理及发展
- OpenCV Java入门五 结合摄像头识脸和拍照
- Android 数据加密算法总结
- V2V-PoseNet:Voxel-to-Voxel Prediction Network for Accurate 3D Hand and Human Pose Estimation from...