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 ...
随机推荐
- Shell: sh,bash,csh,tcsh等shell的区别(转)
转载自:http://zhidao.baidu.com/question/493376840.html, http://blog.sina.com.cn/s/blog_71261a2d0100wmbj ...
- mysqdump+binlog恢复数据
备份全库 [root@db01 b]# mysqldump -uroot -poldboy123 -A > /b/full.sql Warning: Using a password on th ...
- 原生ajax解析&封装原生ajax函数
前沿:对于此篇随笔,完是简要写了几个重要的地方,具体实现细节完在提供的源码做了笔记 <一>ajax基本要点介绍--更好的介绍ajax 1. ajax对象中new XMLHttpReques ...
- Python+Selenium+Appium对APP进行UI自动化测试
1. 安装Python3.7版本 pythonjava的JDK java -version javac nodejs node --versionappium 若nodejs安装完毕,使用npm安装a ...
- maven打包成可运行的jar
在pom.xml添加 <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</ ...
- spring cloud (三) 路由 zuul
1 pom.xml <?xml version="1.0" encoding="UTF-8"?> <project xmlns="h ...
- JS中的this、apply、call、bind(经典面试题)
1.什么是this 在JavaScript中this可以是全局对象.当前对象或者任意对象,这完全取决于函数的调用方式,this 绑定的对象即函数执行的上下文环境(context). 为了帮助理解,让我 ...
- tcp中设置连接超时
直接上代码: 设置连接超时 //首先改成非阻塞套接字 unsigned ; int rm=ioctl(sConnect,FIONBIO,(unsigned long*)&ul); ) { pr ...
- Centos7 虚拟机里查看IP并启动网卡
输入ip查询命名 ip addr 也可以输入 ifconfig(centOs7没有ifconfig命令)查看ip,但此命令会出现3个条目,centos的ip地址是ens33条目中的inet值. 发现 ...
- go语言的坑
go语言在for循环中遍历的临时变量地址是一样的 func main() { //SetLogConfToEtcd() for i := 0; i < 5; i++ { a := i fmt.P ...