C/C++ C++ 11 std::function和std::bind用法
std::bind()
std::bind 主要用于绑定生成目标函数,一般用于生成的回调函数,cocos的回退函数都是通过std::bind和std::function实现的。两个点要明白:
1.绑定全局或者静态函数比绑定成员函数少了个成员变量,且不需要引用如下
//绑定全局函数
auto pfunc = std::bind(func1, 3);
//绑定静态函数
pfunc = std::bind(Func::func6, 3);
//绑定类成员函数,函数前需要添加引用,多一个变量参数fuc
Func func;
pfunc =std::bind(&Func::func2,func, 3);
2.占位符std::placeholders::_1代表此处是要输入参数,且这个参数排在第一位,代码分析更明白
#include <iostream>
#include <functional>
using namespace std;
class Func
{
public:
static void func6(int numa, int numb, int numc)
{
std::cout << numa << " " << numb << " " << numc << endl;
}
void func2(int numa, int numb, int numc,std::string name)
{
std::cout << numa << " " << numb << " " << numc<<" " << name<< endl ;
}
}
void callFunc(std::function<void(int a,int b)> call)
{
call(1,2);
}
void func1(int numa, int numb, int numc)
{
std::cout << numa << " " << numb << " " << numc << endl;
}
int main()
{
callFunc(std::bind(func1, std::placeholders::_1, std::placeholders::_2, 3));
callFunc(std::bind(func1, std::placeholders::_2, std::placeholders::_1, 3));
callFunc(std::bind(func1, std::placeholders::_2, 3, std::placeholders::_1));
callFunc(std::bind(Func::func6, std::placeholders::_1, std::placeholders::_2, 3));
callFunc(std::bind(&Func::func2, func, std::placeholders::_1, std::placeholders::_2, 3, "name"));
}
运行结果如下

std::function
std::function等于函数指针,相比函数指针使用更方便,记录一下几种用法:指向全局或者静态函数,类成员函数,Lambda表达式和仿函数。指向全局函数或者静态函数时使用std::function<void()> testFunc = func3,指向类成员函数时,需要制定函数所属的类的成员变量testFunc = std::bind(&Func::func2, func, 1, 2, 3, "name")。代码如下:
#include <iostream>
#include <string>
#include <iostream>
#include <functional>
using namespace std;
class Func
{
public:
int sum;
Func()
{
sum = 2;
}
void func2(int numa, int numb, int numc,std::string name)
{
std::cout << numa << " " << numb << " " << numc<<" " << name<< endl ;
}
void func4()
{
std::cout << "func4" << endl;
}
void operator() (int a,int b)
{
std::cout << "Operator:" << sum<<" "<<a<<" "<<b<<endl;
}
static void func6(int numa, int numb, int numc)
{
std::cout << numa << " " << numb << " " << numc << endl;
}
static void func5()
{
std::cout << "static func" << endl;
}
};
void callFunc(std::function<void(int a,int b)> call)
{
call(1,2);
}
void func3()
{
std::cout <<"func3"<< endl;
}
void func1(int numa, int numb, int numc)
{
std::cout << numa << " " << numb << " " << numc << endl;
}
int main()
{
Func func;
int sum = 10;
int resultInt = 0;
//全局或者静态函数
std::cout << "全局或者静态函数" << endl;
std::function<void()> testFunc = func3;
testFunc();
testFunc = Func::func5;
testFunc();
//类成员函数
std::cout << "类成员函数" << endl;
testFunc = std::bind(&Func::func2, func, 1, 2, 3, "name");
testFunc();
//Lambda表达式
std::cout << "Lambda表达式" << endl;
testFunc = [=, &resultInt](){std::cout << sum << endl; resultInt += 100; };
testFunc();
cout << "the reslutInt is " << resultInt << endl;
//仿函数
std::cout << "仿函数" << endl;
std::function<void(int a, int b)> abFunc = func;
abFunc(10, 20);
std::cout << resultInt << std::endl;
}
C/C++ C++ 11 std::function和std::bind用法的更多相关文章
- C++11 std::function、std::bind和lambda表达式
参考博客: C++可调用对象详解-https://www.cnblogs.com/Philip-Tell-Truth/p/5814213.html 一.关于std::function与std::bin ...
- C++11新特性应用--实现延时求值(std::function和std::bind)
说是延时求值,注意还是想搞一搞std::function和std::bind. 之前博客<C++11新特性之std::function>注意是std::function怎样实现回调函数. ...
- c++11 符号修饰与函数签名、函数指针、匿名函数、仿函数、std::function与std::bind
一.符号修饰与函数签名 1.符号修饰 编译器将c++源代码编译成目标文件时,用函数签名的信息对函数名进行改编,形成修饰名.GCC的C++符号修饰方法如下: 1)所有符号都以_z开头 2)名字空间的名字 ...
- C++ 中std::function 、std::bind的使用和lambda的使用
std::function是可调用对象的包装器:std::bind是将可点用对象和其参数一起进行绑定,且绑定后的结果可以使用std::function对象进行保存,并延迟调用到需要调用的时候: 在C+ ...
- std::function,std::bind
std::function 和 std::bind 标准库函数bind()和function()定义于头文件中(该头文件还包括许多其他函数对象),用于处理函数及函数参数.bind()接受一个函数(或者 ...
- C++11之std::function和std::bind
std::function是可调用对象的包装器,它最重要的功能是实现延时调用: #include "stdafx.h" #include<iostream>// std ...
- 转 C++11之std::function和std::bind
std::function是可调用对象的包装器,它最重要的功能是实现延时调用: #include "stdafx.h" #include<iostream>// std ...
- 【浅析C++11】std::function和std::bind
目录 std::function可调用对象包装器 std::function基本用法 std::function/std::bind与抽象工厂.工厂方法的一点思考 std::function可调用对象 ...
- std::function与std::bind 函数指针
function模板类和bind模板函数,使用它们可以实现类似函数指针的功能,但却却比函数指针更加灵活,特别是函数指向类 的非静态成员函数时. std::function可以绑定到全局函数/类静态成员 ...
随机推荐
- SLF4J: The requested version 1.6 by your slf4j binding is not compatible with [1.5.5, 1.5.6]
SLF4J:你的SLF4J绑定请求的1.6版不兼容[1.5.5,1.5.6] 在lib中,此时slf4j的版本是1.5.6,而slf4j-log4j的版本是1.6.由于版本的不兼容性,导致了这个错误. ...
- (转)Installing Cloudera Manager and CDH
转:https://blog.csdn.net/qq_26222859/article/details/79976506 译自官网: Installing Cloudera Manager and C ...
- Android7.0后JNI库必须保留Section Headers
此修改在官网的描述如下: Each ELF file has additional information contained in the section headers. These header ...
- PHP 开启错误显示并设置错误报告级别
警告:生产环境永远都不要显示任何错误信息! 显示错误(display_errors)和错误报告(error_reporting)是两回事.PHP 脚本发生错误时,可以根据设置选择是否报告这个错误(记录 ...
- postman测试wsdl类型接口
1 IP地址来源搜索 WEB 服务 接口信息 http://www.webxml.com.cn/WebServices/WeatherWebService.asmx?wsdl 2 设置接口调用地址 ...
- 使用母版页的Web窗体不走Page_Load
原因:母版页--->属性--->生成--->输出路径,这里我将它的默认/bin路径更改了,所以才导致使用此母版页的其它页面也不走Page_Load方法 解决:改回默认的输出路径
- vue 数组中嵌套的对象添加新属性--页面更新
vue 数组中嵌套的对象添加新属性--页面更新:https://www.jianshu.com/p/8f0e5bb13735
- 4、、多变量线性回归(Linear Regression with Multiple Variables)
4.1 多维特征 目前为止,我们探讨了单变量/特征的回归模型,现在我们对房价模型增加更多的特征,例如房间数楼层等,构成一个含有多个变量的模型,模型中的特征为(x1,x2,...xn) 增添更多特征后, ...
- Android关于Activity生命周期详解
子曰:溫故而知新,可以為師矣.<論語> 学习技术也一样,对于技术文档或者经典的技术书籍来说,指望看一遍就完全掌握,那基本不大可能,所以我们需要经常回过头再仔细研读几遍,以领悟到作者的思想精 ...
- git-ssh-keygen
ssh-keygen 先看本地是否已经有了密钥 cd ~/.ssh 该文件夹下会包含两个文件 id_rsa --私钥 id_rsa.pub --公钥 如果没有这两个文件的话就需要重新生成(有的话使用一 ...