c++ stl bind函数介绍
/* stl::bind 使用 */
#include <iostream>
#include <string>
#include <functional> /*
知识补充:
std::bind绑定器 将函数、成员函数和闭包转成function函数对象
将多元(n>1)函数转成一元函数或者(n-1)元函数。
bind()接受一个函数(或者函数对象,或者任何你可以通过"(...)"符号调用的事物),生成一个其有某一个或多个函数参数被“绑定”或重新组织的函数对象。
顾名思义,bind()函数的意义就像它的函数名一样,是用来绑定函数调用的某些参数的。 bind的返回值是可调用实体,可以直接赋给std::function对象 */ /* 学生类 */
class Student
{
public:
//构造函数
Student(unsigned int id, const std::string &name) :_id(id), _name(name)
{
} //析构函数
~Student()
{
} public:
//调用
int test()
{
const std::string msg = "hello world .";
//绑定成员函数
auto func = std::bind(&Student::show, this, std::placeholders::_1); //执行方法
func(msg); return ;
} private:
//展示学生信息
void show(const std::string &msg)
{
printf(" student info : id [%u] , name [%s] , msg [%s] .\n", this->_id, this->_name.c_str(), msg.c_str());
} private:
unsigned int _id;
std::string _name;
}; void test1()
{
/*
知识点1:
std::bind 绑定成员函数,并且将多元函数 转成 一元函数
*/
Student stu(, "tom");
stu.test();
} //全局函数
static void see(int i, char c, double d)
{
printf("===int[%d]====char[%c]===double[%lf]==\n", i, c, d);
} void test2()
{
/*
知识点2:
std::bind 绑定全局函数,并且将多元函数 转成 一元函数
*/
//定义函数指针
void(*pFunc)(int, char, double) = see;
//绑定函数,并且部分赋值参数
auto b_func = std::bind(pFunc, std::placeholders::_1, 'c', 1.2); b_func();
} void test3()
{
/*
知识点3:
std::bind 调整参数顺序
*/
//定义函数指针
void(*pFunc)(int, char, double) = see;
//绑定函数,并且部分赋值参数
auto b_func = std::bind(pFunc, std::placeholders::_2, 'h', std::placeholders::_1);
/*
设计说明:
std::placeholders::_1 表示的是b_func的第一个参数
std::placeholders::_2 表示的是b_func的第二个参数
*/
b_func(1.4, );
} int b_same(int x, int y)
{
printf("---b_same1--x[%d]---y[%d]------\n", x, y);
return ;
} void b_same(double x, double y)
{
printf("---b_same2--x[%lf]---y[%lf]------\n", x, y);
} void test4()
{
/*
知识点4:
std::bind 绑定重载函数,需要显式地指定函数签名
*/ //绑定函数
std::function<void(double, double)> b_func = std::bind((void(*)(double, double))b_same, std::placeholders::_1, std::placeholders::_2); /*
注意:
std::function 的模板参数是 函数签名,而非函数指针
*/ b_func(3.3, 4.4);
} int main()
{
//printf("-----test1()-------\n");
//test1();
//printf("-----test2()-------\n");
//test2();
//printf("-----test3()-------\n");
//test3();
printf("-----test4()-------\n");
test4();
return ;
}
/* std::function初始化注意点 */ #include <iostream>
#include <string>
#include <functional> using namespace std; typedef std::function<void(int)> TestCallback; typedef void(*test_fn)(int); void test()
{
//std::function 初始化方式一
TestCallback cb1 = NULL; //std::function 初始化方式二
TestCallback cb2 = TestCallback(); if (cb1)
{
printf("-----Callback1 not empty .------\n");
} if (cb2)
{
printf("-----Callback2 not empty .------\n");
} //std::function 错误初始化 强调 cb3如果不初始化,值将是不确定
TestCallback cb3; test_fn fn = NULL; cb3 = std::bind(fn, std::placeholders::_1);
if (cb3)
{
/*
说明:
此时 cb3 实际上并没有方法实体,但是 if (cb3) 判断却是不为空,如果调用 cb3() 就会导致程序崩溃
因此在使用std::bind()方法之前一定要判断绑定的函数是否为 NULL
*/
printf("-----Callback3 not empty .------\n");
} } int main()
{
test();
getchar();
return ;
}
c++ stl bind函数介绍的更多相关文章
- c++ stl容器set成员函数介绍及set集合插入,遍历等用法举例
c++ stl集合set介绍 c++ stl集合(Set)是一种包含已排序对象的关联容器.set/multiset会根据待定的排序准则,自动将元素排序.两者不同在于前者不允许元素重复,而后者允许. 1 ...
- STL vector用法介绍
STL vector用法介绍 介绍 这篇文章的目的是为了介绍std::vector,如何恰当地使用它们的成员函数等操作.本文中还讨论了条件函数和函数指针在迭代算法中使用,如在remove_if()和f ...
- 模拟实现兼容低版本IE浏览器的原生bind()函数功能
模拟实现兼容低版本IE浏览器的原生bind()函数功能: 代码如下: if(!Function.prototype.bind){ Function.prototype.bind=function( ...
- javascript 函数介绍
javascript函数使用的时候,往往都比较单一,这里介绍几种不同于我们之前使用的函数调用方式! 1.函数表达式包含名称,用于递归 var f = function s(num) { if (num ...
- 2.cocos2dx 3.2中语法的不同之处,lambada表达式的使用和function和bind函数的使用
1 打开建好的T32 Cocos2dx-3.2的一个项目 2 设置Cocos显示窗口的位置是在AppDelegate.cpp中: 3 设置自适应窗口大小的代码是在上面的 ...
- c/c++ 标准库 bind 函数 详解
标准库 bind 函数 详解 bind函数:接收一个函数名作为参数,生成一个新的函数. auto newCallable = bind(callbale, arg_list); arg_list中的参 ...
- 理解Underscore中的_.bind函数
最近一直忙于实习以及毕业设计的事情,所以上周阅读源码之后本周就一直没有进展.今天在写完开题报告之后又抽空看了一眼Underscore源码,发现上次没有看明白的一个函数忽然就豁然开朗了,于是赶紧写下了这 ...
- Socket编程(C语言实现):bind()函数英文翻译
本篇翻译的bind()函数,我参考的国外网站是: bind 朋友们可以自由转载我对英文的中文翻译,但是对于"作者注:"的描述,转载时请注明出处和作者,否则视为侵权. 下面是翻译的正 ...
- bind函数作用、应用场景以及模拟实现
bind函数 bind 函数挂在 Function 的原型上 Function.prototype.bind 创建的函数都可以直接调用 bind,使用: function func(){ consol ...
随机推荐
- Docker06-仓库
目录 仓库介绍 阿里云仓库介绍 案例:推送redis镜像到阿里云 仓库介绍 仓库(Repository)是集中存放镜像的地方,仓库分为公开仓库和私有仓库两种形式. 最大的公开仓库是 Docker Hu ...
- MySQL存储过程02
这次接着说MySQL存储过程: 我们先看它的多分支控制结构case: case的语句很简单: case 变量名 when 条件1 then 输出结果1; when 条件2 then 输出结果2; .. ...
- Qt编译出错 GL/gl.h:No such file or directory
系统:Ubuntu18.04 软件:QtCreator4.8 Qt5.9.8 编译Qt Widgets Application类型的项目时,出现错误,提示: GL/gl.h: No such file ...
- ReentrantReadWriteLock中的锁降级
锁降级指的是写锁降级为读锁. 因为读锁与读锁之间不互斥,如果是写锁与读锁或者是写锁与写锁就会互斥,所以由写锁变为读锁就降级了. 如果当前线程拥有写锁,然后将其释放,最后再获取读锁,这种并不能称之为锁降 ...
- poj3974 Palindrome(Manacher最长回文)
之前用字符串hash+二分过了,今天刚看了manacher拿来试一试. 这manacher也快太多了%%% #include <iostream> #include <cstring ...
- Please umount the filesystem and rectify the problem(s)
1.输入命令:ls -l /dev/mapper 2.再输入:xfs_repair /dev/dm-0 3.输入命令:xfs_repair -L /dev/dm-0 4.最后进行重启:init 6 等 ...
- 关于mysql数据库utf-8问题
1.bug的出现 我们正常使用utf-8类型来给我们的字段的字符编码,对于正常的都没有问题,例如姓名呀,性别年龄等,但是会遇到一个问题就是如果存储表情emoji则无法存入utf-8编码的字段 2.my ...
- windows——快速得到某一目录下所有文件的名称
前言 其实用的是windows上dir命令,能快速得到某一目录下的所有文件名称,天天那么忙都没时间写博客(┬_┬) 步骤 打开cmd并cd到某目录下 C:\Users\Administrator.KI ...
- Json在序列化注意问题
Java中的Json序列化,不容忽视的getter 问题重现 public class AjaxJson { private boolean success; private String msg; ...
- CentOS7下安装Python3和PIP3
为了方便以后编译,所以整合了下配置流程 先查看是否安装了Python3 python3 -V 如果没有安装,则先安装依赖包 yum install zlib-devel bzip2-devel ope ...