/* 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函数介绍的更多相关文章

  1. c++ stl容器set成员函数介绍及set集合插入,遍历等用法举例

    c++ stl集合set介绍 c++ stl集合(Set)是一种包含已排序对象的关联容器.set/multiset会根据待定的排序准则,自动将元素排序.两者不同在于前者不允许元素重复,而后者允许. 1 ...

  2. STL vector用法介绍

    STL vector用法介绍 介绍 这篇文章的目的是为了介绍std::vector,如何恰当地使用它们的成员函数等操作.本文中还讨论了条件函数和函数指针在迭代算法中使用,如在remove_if()和f ...

  3. 模拟实现兼容低版本IE浏览器的原生bind()函数功能

    模拟实现兼容低版本IE浏览器的原生bind()函数功能: 代码如下: if(!Function.prototype.bind){   Function.prototype.bind=function( ...

  4. javascript 函数介绍

    javascript函数使用的时候,往往都比较单一,这里介绍几种不同于我们之前使用的函数调用方式! 1.函数表达式包含名称,用于递归 var f = function s(num) { if (num ...

  5. 2.cocos2dx 3.2中语法的不同之处,lambada表达式的使用和function和bind函数的使用

    1        打开建好的T32  Cocos2dx-3.2的一个项目 2        设置Cocos显示窗口的位置是在AppDelegate.cpp中: 3  设置自适应窗口大小的代码是在上面的 ...

  6. c/c++ 标准库 bind 函数 详解

    标准库 bind 函数 详解 bind函数:接收一个函数名作为参数,生成一个新的函数. auto newCallable = bind(callbale, arg_list); arg_list中的参 ...

  7. 理解Underscore中的_.bind函数

    最近一直忙于实习以及毕业设计的事情,所以上周阅读源码之后本周就一直没有进展.今天在写完开题报告之后又抽空看了一眼Underscore源码,发现上次没有看明白的一个函数忽然就豁然开朗了,于是赶紧写下了这 ...

  8. Socket编程(C语言实现):bind()函数英文翻译

    本篇翻译的bind()函数,我参考的国外网站是: bind 朋友们可以自由转载我对英文的中文翻译,但是对于"作者注:"的描述,转载时请注明出处和作者,否则视为侵权. 下面是翻译的正 ...

  9. bind函数作用、应用场景以及模拟实现

    bind函数 bind 函数挂在 Function 的原型上 Function.prototype.bind 创建的函数都可以直接调用 bind,使用: function func(){ consol ...

随机推荐

  1. OAuth 2.0 的一个简单解释

    OAuth 2.0 是目前最流行的授权机制,用来授权第三方应用,获取用户数据. 这个标准比较抽象,使用了很多术语,初学者不容易理解.其实说起来并不复杂,下面我就通过一个简单的类比,帮助大家轻松理解,O ...

  2. Activity知识点详解

    Activity知识点详解 一.什么是Activity 官方解释: The Activity class is a crucial component of an Android app, and t ...

  3. gps示例代码

    /* main.c */ #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #incl ...

  4. Kotlin协程第一个示例剖析及Kotlin线程使用技巧

    Kotlin协程第一个示例剖析: 上一次https://www.cnblogs.com/webor2006/p/11712521.html已经对Kotlin中的协程有了理论化的了解了,这次则用代码来直 ...

  5. 2019年牛客多校第二场 H题Second Large Rectangle

    题目链接 传送门 题意 求在\(n\times m\)的\(01\)子矩阵中找出面积第二大的内部全是\(1\)的子矩阵的面积大小. 思路 处理出每个位置往左连续有多少个\(1\),然后对每一列跑单调栈 ...

  6. JS中的this、apply、call、bind(经典面试题)

    1.什么是this 在JavaScript中this可以是全局对象.当前对象或者任意对象,这完全取决于函数的调用方式,this 绑定的对象即函数执行的上下文环境(context). 为了帮助理解,让我 ...

  7. js判断是否第一次访问跳转

    今天分享一套关于Js劫持代码,进行判断第一次访问进行跳转,仅供大家参考学习! 未加密: if (c.indexOf('isfirstvisited=false') != -1) { } else { ...

  8. JQ js 对数组的操作

    1.数组的创建 var arrayObj = new Array(); //创建一个数组 var arrayObj = new Array([size]); //创建一个数组并指定长度,注意不是上限, ...

  9. finall语句是在return语句执行前被执行还是执行后被执行?

    finally对try...catch的影响和执行时间 一.finally语句不被执行的两种情况 我们在学习抛出异常的时候学习到了finally语句块,这个语句块一般会被执行,但是有两种情况下不被执行 ...

  10. IDEA中用mybatis插件生成逆向工程

    目录 maven项目 在resources目录下新建generatorConfig.xml文件 在resources目录下新建config.properties文件 运行 maven项目 <?x ...