/* 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. 【转】Jperf2.0下载及使用方法介绍

    iPerf图形化工具Jperf图文使用教程   在前文介绍iPerf时,我们就提到了Jperf这款软件,因为iPerf没有图形界面,操作起来不是太方便,而Jperf则是将iPerf命令行图形化的JAV ...

  2. fastJSON的常用方法总结

    fastJSON的常用方法总结 fastJSON中常用的对象是JSON,JSONArray,JSONObject三个对象.常用的方法如对象转为JSON字符串,JSON字符串转为对象,JSON字符串转为 ...

  3. linux内核makefile概览

    linux内核makefile概览 本博客参照内核官方英文文档 linux的内核makefile主要用于编译整个内核源码,按照用户的需求生成各种目标文件,对于用户来说,编译内核时非常简单的,只需要几个 ...

  4. Linux查看文件指定行数内容

    1.tail date.log               输出文件末尾的内容,默认10行 tail -20  date.log        输出最后20行的内容 tail -n -20  date ...

  5. DT6.0关于SQL注入漏洞修复问题

    阿里云安全平台提示:Destoon SQL注入,关于: Destoon的/mobile/guestbook.php中$do->add($post);这行代码对参数$post未进行正确转义,导致黑 ...

  6. Python3 - 基础(运算符)

    Python3-运算符 举个简单的例子 4 +5 = 9 . 例子中,4 和 5 被称为操作数,"+" 称为运算符. 算术运算符 比较(关系)运算符 赋值运算符 逻辑运算符 位运算 ...

  7. vue提示插件[vscode]

    在VSCode Marketplace 搜素Vue 出现关于语法高亮的插件有 vue,vue-beautify,vue-color,VueHelper,vertur等等.比较了下载数量可以了解到,ve ...

  8. 微信小程序底部导航栏部署

    在微信小程序开发app.json(app.json它是定义全局页面) 只是用来部署微信底部的图标,最多不能大于五个 "tabBar":{ "selectedColor&q ...

  9. learning java transient 自定义序例化

    public class Person implements java.io.Serializable { private String name; private transient int age ...

  10. C语言博客06-结构体

    1.本章学习总结 1.1 学习内容总结 结构体如何定义.成员如何赋值 1.结构体的一般形式为: struct 结构体名 { 数据类型 成员名1: 数据类型 成员名2: : 数据类型 成员名n: }: ...