C++11基础-----std::function & std::bind
来源:互联网 发布:好乐宝软件下载 编辑:程序博客网 时间:2024/05/29 07:36
1.std::function可以取代函数指针的作用。因为它可以保存函数延迟执行,所以比较适合作为回调函数。
2.std::bind用来将可调用对象与其参数一起进行绑定。
3.为什么C++11加入std::function,说白了就是为了让函数对象化。那么把函数对象化的目的是什么呢?就是为了进一步深化以数据为中心(封装)的面相对象思想。(连函数都对象化了)
4.std::function的执行时间代价很大,因为要根据函数生成一个可调用的类然后再实例化出一个对象。所以说,到处都用std::function是一件很糟糕的事情。
总结:只有在使用泛型算法或者一些比较特殊的情况下才应该使用std::function,其它情况---”比如即使要写callback(函数的参数是callback函数),那么除非你要保证这个函数可以接受任何形式的函数(包括可调用对象、lambda等),否则依然建议使用函数指针、模板”,还是应该用传统的方法。
#include <stdio.h>#include <iostream>#include <functional>using namespace std;//普通函数int func(int a){ cout<<__FUNCTION__<<"->"<<a<<endl; return a;}//模版类函数template <class T>T sum(T t1, T t2){ cout<<__FUNCTION__<<":t1="<<t1<<","<<"t2="<<t2<<"->"<<(t1 + t2)<<endl; return (t1 + t2);}//函数对象,仿函数struct S_Mouse{ void operator()(int a, int b) { cout<<"S_Mouse::"<<__FUNCTION__<<":a="<<a<<","<<"b="<<b<<endl; }};//静态成员函数class T_Model{public: static void SetColor(int i) { m_iColor = i; cout<<"T_Model::"<<__FUNCTION__<<":Color="<<m_iColor<<endl; }private: static int m_iColor;};int T_Model::m_iColor = 0;//可被转换为函数指针对象的类struct T_Bar{ using fr_t = void(*)(void); operator fr_t() { return ptr_func; } static void ptr_func() { cout<<"T_Bar::"<<__FUNCTION__<<endl; }};//回调函数实例class T_CallBack{public: T_CallBack(const std::function<void(int,int)> &f):_callback(f) { } void notify(int a, int b) { _callback(a, b); }private: std::function<void(int, int)> _callback;};//作为参数传递void call_even(const std::function<int(int)> &f){ cout<<__FUNCTION__<<endl;}int main(){ int (*func_ptr)(int) = &func; //原始函数指针 func_ptr(1); std::function<int(int)> f1 = func; //普通函数调用 f1(2); auto f2 = std::bind(f1, placeholders::_1); //使用std::bind功能绑定,占位符placeholders::_1 f2(3); std::function<int(int, int)> f3 = sum<int>;//模版调用 f3(3,5); std::function<void(int, int)> f4 = S_Mouse();//仿函数调用 f4(1,3); std::function<void(int)> f5 = &T_Model::SetColor;//静态成员函数调用 f5(9); T_Bar bar; bar(); S_Mouse mouse; //普通对象调用 mouse(5,6); S_Mouse mouse1; T_CallBack aa(mouse1); aa.notify(7,0); call_even(func);//回调函数作为参数 cout<<"bind callback->"; auto f6 = std::bind(func, std::placeholders::_1); //使用绑定作为回调函数参数 call_even(f6); return 0;}
运行结果:
[cyh@iZn6p6j5eiblyzZ ~]$ ./testfunc->1func->2func->3sum:t1=3,t2=5->8S_Mouse::operator():a=1,b=3T_Model::SetColor:Color=9T_Bar::ptr_funcS_Mouse::operator():a=5,b=6S_Mouse::operator():a=7,b=0call_evenbind callback->call_even[cyh@iZn6p6j5eiblyzZ ~]$
阅读全文
0 0
- C++11基础-----std::function & std::bind
- std::function std::bind
- std::function std::bind
- C++ 11 std::function std::bind使用
- C++11 std::bind与std::function
- C++11 std::function、std::bind
- c++11 std::bind与std::function
- std::function 和 std::bind
- lambda, std::function, std::bind
- 笔记-std::function<> && std::bind()
- std::function 和 std::bind
- std::bind与std::function
- std::function std::bind理解
- std::bind std::function 用法
- std::function 与 std::bind 的基础使用
- std::bind绑定器、std::function、extern C的使用
- C++11 学习笔记 std::function和bind绑定器
- C++11 笔记 std::function,bind绑定器和lambda
- QWT的配置和使用(1)
- java递归浅析合并排序
- 杭电1002 A + B Problem II
- 机器学习之旅:数据预处理的对象-数据
- C++常成员函数和常对象、对象指针和对象引用
- C++11基础-----std::function & std::bind
- 内存中的堆和栈
- java语言基础(98)——定时器和定时任务
- hbase学习教程(三):HBase优化技巧、HBase基本命令、使用Java API对HBase服务器进行操作
- 杭电1003 Max Sum
- NetPerfMeter : A Network Performance Metering Tool Introduction
- 51 nod 1412 AVL树的种类(树形DP)
- 杭电1004 Let the Balloon Rise
- Java后台框架篇--Struts2.0之struts.xml的常用配置