C/C++ C++ 11 std::bind()】的更多相关文章

{ #define CC_CALLBACK_0(__selector__,__target__, ...) std::bind(&__selector__,__target__, ##__VA_ARGS__)#define CC_CALLBACK_1(__selector__,__target__, ...) std::bind(&__selector__,__target__, std::placeholders::_1, ##__VA_ARGS__)#define CC_CALLBAC…
从最基础的了解,std::bind和std::function /* * File: main.cpp * Author: Vicky.H * Email: eclipser@163.com */ #include <iostream> #include <functional> #include <typeinfo> #include <string.h> int add1(int i, int j, int k) { return i + j + k;…
std::function是可调用对象的包装器,它最重要的功能是实现延时调用: #include "stdafx.h" #include<iostream>// std::cout #include<functional>// std::function void func(void) { std::cout << __FUNCTION__ << std::endl; } class Foo { public: static int fo…
场景 1.C++11 引入了std::function 对象, 这个对象可以通过std::bind封装所有的函数, 并通过代理调用这个std::function的方式调用这个函数. 比如通过统一的方式调用不定参数个数的函数. 这对实现代理模式等设计模式帮助是很大的. 说明 1.cppreference 上的使用例子我就不多说了, 除了可以用在标准库上, 也是可以用在自己设计带代码结构里. 和 boost.bind,boost.function基本一样. 2.以下例子说明如何封装线程函数, 可以指…
cocos new 出新的项目之后,仔细阅读代码,才发现了一句3.0区别于2.0的代码: auto closeItem = MenuItemImage::create( "CloseNormal.png", "CloseSelected.png", CC_CALLBACK_1(HelloWorld::menuCloseCallback, this)); 2.0内的代码用的不是CC_CALLBACK_1而是menu_selector. CC_CALLBACK系列是3.…
昨天同事让帮忙写一小功能,才发现cocos2d-x 3.0 和 cocos2d-x 3.0rc0 差别还是相当大的. 发现Label这一个控件,3.0就比rc0版本多了一个创建函数,更为关键的是3.0内的Label锚点是在ccp(0.5,0.5),而一直3.0rc0是ccp(0,0). 累觉不爱.尽管cocos2d-x改变太快,兼容性一次次的暴露出不足,但是,总归是向好的方向进行.于是下载了3.0来玩玩~ cocos new 出新的项目之后,仔细阅读代码,才发现了一句3.0区别于2.0的代码:…
c++11中增加了std::function和std::bind,可更加方便的使用标准库,同时也可方便的进行延时求值. 可调用对象 c++中的可调用对象存在以下几类: (1)函数指针 (2)具有operator()成员函数的类对象(仿函数) (3)可被转换为函数指针的类对象 (4)类成员(函数)指针 void func(void){ //.... } struct Foo{ void operator()(void){ //... } }; struct Bar{ using fr_t = vo…
std::function是可调用对象的包装器,它最重要的功能是实现延时调用: #include "stdafx.h" #include<iostream>// std::cout #include<functional>// std::function void func(void) { std::cout << __FUNCTION__ << std::endl; } class Foo { public: static int fo…
再来看看std::bind C++11中提供了std::bind.bind()函数的意义就像它的函数名一样,是用来绑定函数调用的某些参数的. bind的思想实际上是一种延迟计算的思想,将可调用对象保存起来,然后在需要的时候再调用.而且这种绑定是非常灵活的,不论是普通函数.函数对象.还是成员函数都可以绑定,而且其参数可以支持占位符,比如你可以这样绑定一个二元函数auto f = bind(&func, _1, _2);,调用的时候通过f(,)实现调用. 简单的认为就是std::bind就是std:…
std::bind: Each argument may either be bound to a value or be a placeholder: (1).If bound to a value, calling the returned function object will always use that value as argument; (2).If a placeholder, calling the returned function object forwards an…
参考博客: C++可调用对象详解-https://www.cnblogs.com/Philip-Tell-Truth/p/5814213.html 一.关于std::function与std::bind 翻看了几篇博客,还不如看书逻辑性好.以下内容摘自祁宇<深入应用C++11: 代码优化与工程级应用>一书. 有以下4种情况可被称为可调用对象. 1.是一个函数指针.(这里的函数要求是如C函数一样的编译期内存确定的函数指针) 2.是一个具有operator()成员函数的类对象.(让类重载调用操作符…
说是延时求值,注意还是想搞一搞std::function和std::bind. 之前博客<C++11新特性之std::function>注意是std::function怎样实现回调函数. 如今就算是补充吧,再把std::bind进行讨论讨论. 何为Callable Objects? 就可以调用对象,比方函数指针.仿函数.类成员函数指针等都可称为可调用对象. 对象包装器 Function wrapper Class that can wrap any kind of callable eleme…
C++11中的std::bind 最近在看看cocos2dx的源代码,发现了cocos2dx 3.0相对于2.0改动了很多,最大的改变就是大量的使用了C++11的特性,比如auto等.其中有一个关于回调函数绑定的宏定义就使用了std::bind特性 // new callbacks based on C++11 #define CC_CALLBACK_0(__selector__,__target__, ...) std::bind(&__selector__,__target__, ##__V…
目录 std::function可调用对象包装器 std::function基本用法 std::function/std::bind与抽象工厂.工厂方法的一点思考 std::function可调用对象包装器 C++可调用对象(Callable Objects)定义如下: 函数指针:与C语言一致: 类成员函数指针: 仿函数(functor):也成函数对象,重载operator()运算符的类/结构体对象: lambda表达式. std::function是Callable Objects的包装器(W…
一.符号修饰与函数签名 1.符号修饰 编译器将c++源代码编译成目标文件时,用函数签名的信息对函数名进行改编,形成修饰名.GCC的C++符号修饰方法如下: 1)所有符号都以_z开头 2)名字空间的名字 名字空间(或类)的名字前加上N 名字前还有一个数字,是名字的字符数.比如1C,1是C的长度. 3)函数名 与名字空间一样,函数名前也有数字,比如4func,4是func的字符数. 4)参数 参数以E开头 例子 N::C::func(int) 的函数签名经过修饰为_ZN1N1C4funcEi 2.函…
note 更多用法,请参考: cppreference 用的少,容易忘. 我的理解 类似延迟计算. 比如,回调函数,将回调函数传入后,回调函数不一定马上被调用. 它是一个模板类,调用后将生成一个新的调用对象A.调用该对象A与调用原函数是等价的. 声明 截至目前,它的声明如下 需要包含头文件 #include <functional> 一个例子 代码 下面的print函数负责输出参数的值, 通过使用std::bind, 生成一个新的对象 func, 此时, func(a, b, c);与prin…
std::bind 接受一个可调用的对象,一般就是函数呗.. 还是先上代码: void func(int x, int y, int z) { std::cout << "hello!" << x << y << z << std::endl; } 我们可以通过std::bind调用这个函数: std::_Bind<, , ); 其中7,8,9是传给func函数的参数.看这恶心的声明,简直比上一篇博客举得例子还要恶心,所…
1. 温故知新:std::bind1st和std::bind2nd (1)bind1st.bind2nd首先它们都是函数模板,用于将参数绑定到可调用对象(如函数.仿函数等)的第1个或第2个参数上. (2)函数的返回值是一个函数对象.它用于包装和改造传入的函数(或仿函数),并形成一个新的仿函数对象(是一个可调用对象). (3)与旧的可调用对象相比,新的仿函数对象参数个数少了1个.(相当于给少掉的那个参数一个默认的值) 2. std::bind绑定器 (1)首先,std::bind也是一个函数模板,…
/* * File: main.cpp * Author: Vicky.H * Email: eclipser@163.com */ #include <iostream> #include <functional> #include <typeinfo> #include <string.h> int add1(int i, int j, int k) { return i + j + k; } class Utils { public: Utils(co…
//lamda //first lamda [] {}; // second lamda []() //or no need () when paramater is null { std::cout << "second" << std::endl; }();// last add(), express will call this lamda func // 3 with return type auto kkk = []() { return 1; }()…
std::bind() std::bind 主要用于绑定生成目标函数,一般用于生成的回调函数,cocos的回退函数都是通过std::bind和std::function实现的.两个点要明白: 1.绑定全局或者静态函数比绑定成员函数少了个成员变量,且不需要引用如下 //绑定全局函数    auto pfunc = std::bind(func1, 3);    //绑定静态函数    pfunc = std::bind(Func::func6, 3);    //绑定类成员函数,函数前需要添加引用…
std::bind 用于绑定一个函数,返回另外一种调用方式的函数对象 ,可以改变参数顺序 和个数,特别是在多线程的程序中,经常用它将函数进行包装,然后打包发送给工作线程,让工作线程去执行我们的任务. std::function 用于构建一个函数特别是 回调函数  ,用于替代 函数指针/*常和匿名函数一起用回调*/ 参考以下代码: #include<iostream> #include "functional" using namespace std; double calc…
在cocos2dx 3.0 版本号,回调函数本质4一个CC_CALLBACK_N 替换功能.N的回调函数的参数的数量的代表 1.让我们来看看这些CC_CALLBACK_N怎么用 比方action的回调 ,CC_CALLBACK_0 auto animation = Animation::create(); auto animate = Animate::create(animation); CallFunc* animateDone = CallFunc::create(CC_CALLBACK_…
C++本身有引用(&),为什么C++11又引入了std::ref(或者std::cref)? 主要是考虑函数式编程(如std::bind)在使用时,是对参数直接拷贝,而不是引用.如下例子: #include <functional> #include <iostream> void f(int& n1, int& n2, const int& n3) { std::cout << "In function: " <…
std::bind bind是对C++98标准中函数适配器bind1st/bind2nd的泛化和增强,可以适配任意的可调用对象,包括函数指针.函数引用.成员函数指针和函数对象. bind接受的第一个参数必须是一个可调用的对象f,可以是函数.函数指针.函数对象和成员函数指针,之后接受的参数的数量必须与f的参数数量相等,这些参数将被传递给f作为入参. 绑定完成后,bind会返回一个函数对象,它内部保存了f的拷贝,具有operator(),返回值类型被自动 推导为f的返回值类型.反生调用时,这个函数对…
The example of callback in C++11 is shown below. #include <functional> void MyFunc1(int val1, int val2) { std::cout << __PRETTY_FUNCTION__ << val1 + val2 << std::endl; } void MyFunc2(int val1, int val2) { std::cout << __PRETT…
1. std::function (1)首先是一个类模板,用于包装可调用对象.可以容纳除了类成员(函数)指针之外的所有可调用对象. (2)可以将普通函数,lambda表达式和函数对象类统一起来.尽管它们并不是相同的类型,但通过function类模板,可以转化为相同类型的对象(function对象),这样就可以用统一的方式来保存或传递可调用对象. (3)实现了一套类型消除机制,可用统一的方式处理不同类型的可调用对象. (4)std::function进一步深化以数据为中心(封装)的面向对象思想(连…
std::function是可调用对象的包装器:std::bind是将可点用对象和其参数一起进行绑定,且绑定后的结果可以使用std::function对象进行保存,并延迟调用到需要调用的时候: 在C++中,可调用实体主要包括函数,函数指针,函数引用,可以隐式转换为函数指定的对象,或者实现了opetator()的对象(即C++98中的functor).C++0x中,新增加了一个std::function对象,std::function对象是对C++中现有的可调用实体的一种类型安全的包裹(我们知道像…
引子 最近群里比较热闹,大家都在山寨c++11的std::bind,三位童孩分别实现了自己的bind,代码分别在这里: 木头云的实现 mr.li的实现 null的实现,null的另一个版本的实现 这些实现思路和ms stl的std::bind的实现思路是差不多的,只是在实现的细节上有些不同.个人觉得木头云的实现更简洁,本文中的简单实现中select函数用的是木头云的,在此表示感谢.下面我们来分析一下bind的基本原理. bind的基本原理 bind的思想实际上是一种延迟计算的思想,将可调用对象保…
一. std::bind (一)std::bind实现的关键技术 [编程实验]探索bind原理,实现自己的bind函数 #include <iostream> #include <tuple> using namespace std; //1. 占位符定义 template<size_t idx> struct placeholder{}; template<size_t idx> using ph = placeholder<idx>; con…