C++11|C++11 学习笔记之std::function和bind绑定器
std::function
C++中的可调用对象虽然具有比较统一操作形式(除了类成员指针之外,都是后面加括号进行调用),但定义方法五花八门。为了统一泛化函数对象,函数指针,引用函数,成员函数的指针的各种操作,让我们可以按更统一的方式写出更加泛化的代码,C++11推出了std::function。
std::function是可调用对象的包装器。它是一个类模板,可以容纳除了类成员(函数)指针之外的所有可调用对象。通过指定它的模板参数,它可以用统一的方式处理函数,函数对象,函数指针,并允许保存和延迟执行它们。
1.1 可调用对象(Callable Objects)
可调用对象有如下几种:
- 函数指针
- 具有operator()成员函数的类对象(仿函数)
- 可被转换为函数指针的类对象
- 类成员(函数)指针
1.2 可调用对象包装器——std::function C++中的可调用对象虽然具有比较统一操作形式(除了类成员指针之外,都是后面加括号进行调用),但定义方法五花八门。为了统一泛化函数对象,函数指针,引用函数,成员函数的指针的各种操作,让我们可以按更统一的方式写出更加泛化的代码,C++11推出了std::function。
【C++11|C++11 学习笔记之std::function和bind绑定器】std::function是可调用对象的包装器。它是一个类模板,可以容纳除了类成员(函数)指针之外的所有可调用对象。通过指定它的模板参数,它可以用统一的方式处理函数,函数对象,函数指针,并允许保存和延迟执行它们。
#include#include using namespace std; void func(void){cout << __FUNCTION__ < : "; return a; } }; class Bar { public:int operator()(int a){cout << __FUNCTION__ << "(" << a << ") ->: "; return a; } }; int main(){//綁定一個普通函數std::function fry = func; fry(); //綁定一個類的靜態成員函數std::function fr2 = Foo::foo_func; cout << fr2(123) << endl; //綁定一個仿函數Bar bar; fr2 = bar; cout << fr2(123) <
root@ubuntu:~/c++# g++ -std=c++11 func1.cpp -o funcroot@ubuntu:~/c++# ./func funcfoo_func(123) ->: 123operator()(123) ->: 123root@ubuntu:~/c++#
std::function的使用方法:我们给std::function填入合适的函数签名(即一个函数类型,只需要包括返回值和参数表)之后,它就变成了一个可以容纳所有这一类调用方式的“函数包装器”。
#include#include using namespace std; class A { public:A(const std::function & f) :callback_(f){}void notify(void){callback_(); } private:std::function callback_; }; class Foo { public:void operator()(void){cout <<"in " <<__FUNCTION__<< endl; } }; int main(){Foo foo; A aa(foo); aa.notify(); return 0; }
"func2.cpp" 32L, 452C writtenroot@ubuntu:~/c++# g++ -std=c++11 func2.cpp -o funcroot@ubuntu:~/c++# ./funcin operator()
C++11 std::function 是一种通用、多态的函数封装,它的实例可以对任何可以调用的目标实体进行存储、复制和调用操作,它也是对 C++中现有的可调用实体的一种类型安全的包裹(相对来说,函数指针的调用不是类型安全的),换句话说,就是函数的容器。当我们有了函数的容器之后便能够更加方便的将函数、函数指针作为对象进行处理。例如:lambda函数
到此这篇关于C++11 学习笔记之std::function和bind绑定器的文章就介绍到这了,更多相关C++11 std::function和bind绑定器内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
推荐阅读
- EffectiveObjective-C2.0|EffectiveObjective-C2.0 笔记 - 第二部分
- 由浅入深理解AOP
- 继续努力,自主学习家庭Day135(20181015)
- python学习之|python学习之 实现QQ自动发送消息
- Android中的AES加密-下
- 一起来学习C语言的字符串转换函数
- 定制一套英文学习方案
- 漫画初学者如何学习漫画背景的透视画法(这篇教程请收藏好了!)
- 《深度倾听》第5天──「RIA学习力」便签输出第16期
- 如何更好的去学习