bind 是什么?

bind 顾名思义: 绑定

通俗来讲呢,可以这么理解有点像函数指针的意思。

资料上是这么讲的:可以将 bind 函数看做一个通用函数的适配器,它接受一个可调用对象,生成一个新的可以调用对象来“适应”原对象参数列表

它一般调用形式:

// 其中 newCallable 是一个可调用的对象, arg_list 是以逗号分隔的参数列表
// 这时我们调用 newCallable,newCallable 就会调用 callable, 并用 arg_list 传递参数
auto newCallable = bind(callable, arg_list);

好了,重点在于 arg_list 里,那么我们如何传入参数呢

它们是靠这些参数的位置来识别的,形如 _n 之类的, n 是整形, _1 是第一个参数,_2是第二个参数,以此类推。

而名字 _n 是定义在 placeholders 命名空间中, 而 placeholders 本身又定义在 std 命名空间中, 所以形如:

using std:: placeholders::_1

接下来,我们举例几个列子

举个栗子

bind 是在头文件 #include <functional> 中, 首先要包含它。

1. bind 无参数的普通函数

#include <iostream>
#include <functional> // 包含此头文件 // 普通函数
void Fun()
{
std::cout << "I am Fun!" << std::endl;
} // 主函数
int main()
{
auto fun = std::bind(Fun); // 适配 Fun 函数并返回一个可调用的对象
fun();
return 0;
}

调试结果:

2. bind 1个参数的普通函数

#include <iostream>
#include <functional> // 包含此头文件 // 普通函数
void Fun(int a)
{
std::cout << "I am Fun! a = " << a <<std::endl;
} // 主函数
int main()
{
auto fun = std::bind(Fun, std::placeholders::_1);
fun(5);
return 0;
}

调试结果:

3. bind 多个参数的普通函数

#include <iostream>
#include <functional> // 包含此头文件 // 普通函数
int Fun(int a, int b)
{
return a - b;
} // 主函数
int main()
{
auto fun = std::bind(Fun, std::placeholders::_1, std::placeholders::_2);
std::cout << fun(5, 2) << std::endl;
return 0;
}

调试结果:

4. bind 多个参数的普通函数并打乱参数位置

#include <iostream>
#include <functional> // 包含此头文件 // 普通函数
int Fun(int a, int b)
{
return a - b;
} // 主函数
int main()
{
auto fun1 = std::bind(Fun, std::placeholders::_1, std::placeholders::_2);
auto fun2 = std::bind(Fun, std::placeholders::_2, std::placeholders::_1);
std::cout << fun1(5, 2) << std::endl;
std::cout << fun1(5, 2) << std::endl;
return 0;
}

调试结果:

5. bind 类的成员函数

#include <iostream>
#include <functional> // 包含此头文件 class MyClass {
public:
MyClass() {}
~MyClass() {} public:
void printInfo() {
std::cout << "MyClass Info." << std::endl;
}
}; // 主函数
int main()
{
MyClass A;
auto fun = std::bind(&MyClass::printInfo, A);
fun();
return 0;
}

调试结果:

再举个应用栗子

#include <iostream>
#include <functional> // 包含此头文件 typedef std::function<void(int)> CallbackType;
// A 类
class MyClassA {
public:
void regeditCallBack(CallbackType fun)
{ _callback_fun = fun; } void printInfoA(int d)
{ _callback_fun(d); } private:
CallbackType _callback_fun;
};
// B 类
class MyClassB {
public:
void printInfoB(int d) {
std::cout << d << std::endl;
}
}; // 主函数
int main()
{
MyClassB B;
auto funB = std::bind(&MyClassB::printInfoB, B, std::placeholders::_1); MyClassA A;
A.regeditCallBack(funB);
A.printInfoA(1); return 0;
}

调试结果:

结束

学无止境

C++11 标准库 bind 函数的更多相关文章

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

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

  2. 标准库bind函数中使用占位符placeholders

    placeholders ,占位符.表示新的函数对象中参数的位置.当调用新的函数对象时,新函数对象会调用被调用函数,并且其参数会传递到被调用函数参数列表中持有与新函数对象中位置对应的占位符. 举个例子 ...

  3. C++11 标准库也有坑(time-chrono)

    恰巧今天调试程序遇到时间戳问题, 于是又搜了搜关于取时间戳,以及时间戳转字符串的问题, 因为 time()   只能取到秒(win和linux) 想试试看能不能找到 至少可以取到毫秒的, 于是, 就找 ...

  4. Atitit 数据库 标准库  sdk 函数库 编程语言 mysql oracle  attilax总结

    Atitit 数据库 标准库  sdk 函数库 编程语言 mysql oracle  attilax总结 1.1. 常见的编程语言以及数据库 sql内部函数库标准化库一般有以下api1 1.2. 各个 ...

  5. c++多线程编程:实现标准库accumulate函数的并行计算版本

    今天使用c++实现了标准库头文件<numeric>中的accumulate函数的并行计算版本,代码如下,注释写的比较详细,仅对其中几点进行描述: ①该实现假定不发生任何异常,故没有对可能产 ...

  6. C++11标准库中cstdio头文件新增的5个格式化I/O函数学习

    刚开始学网络编程,稍微扩展书上的简单C/S程序时,发现以前太忽略标准I/O这一块,查官网发现C++11新增了几个格式化I/O函数. snprintf    将格式化输出写入到有大小限制的缓存中 vfs ...

  7. 11. 标准库浏览 – Part II

    第二部分包含了支持专业编程工作所需的更高级的模块,这些模块很少出现在小脚本中. 11.1. 输出格式 reprlib 模块为大型的或深度嵌套的容器缩写显示提供了 :repr() 函数的一个定制版本: ...

  8. C标准库常用函数概要

    stdio.h printf()/fprintf() printf的返回值是打印的字符数, 发生错误则返回负数 scanf()/fscanf() scanf的返回值是成功赋值的变量个数, 失败则返回E ...

  9. 【C++】标准库sort函数的自定义排序

    自定义排序需要单独写一个compare函数 例1 LeetCode 056. Merge Intervals Given a collection of intervals, merge all ov ...

随机推荐

  1. 探讨 Rust 智能指针 | Vol.17

    分享主题:<探讨 Rust 智能指针>| Vol. 17 分享讲师:苏林 分享时间: 周日晚上 2021-11-14 20:30-21:30 腾讯会议地址: https://meeting ...

  2. 菜鸡的Java笔记 第三十一 扩展结构

    .新特性        可变参数的意义以及实现                那么下面通过一个简单的思考来分析可变参数的存在意义        范例:如果说现在要定义一个方法,这个方法可以实现任意多个 ...

  3. Java的脚本机制、编译器API

    学习 xxl-job 定时任务时了解到基于 JVM 的 Grovvy 脚本语言.搭建 Jenkins 时知道了编译API 1. Java 脚本机制 Java 的脚本 API 可以让我们调用 JavaS ...

  4. [cf516E]Drazil and His Happy Friends

    令$d=\gcd(n,m)$,存在$x$和$y$使得$xn+i=ym+j$的充要条件是$i\equiv j(mod \ d)$,因此将$xd+i$(其中$0\le i<d$)作为一组,共有$d$ ...

  5. .NET 开源免费图表组件库,Winform,WPF 通用

    大家好, 我是等天黑, 今天给大家介绍一个功能完善, 性能强悍的图表组件库 ScottPlot, 当我第一次在 github 上看到这个库, 我看不懂,但我大受震撼, 这么好的项目当然要分享出来了. ...

  6. 和安卓对接老是ping不通?试试内网映射

    https://ngrok.cc/download.html

  7. 什么是CLI、GUI

    就是命令行界面command-line interface,也有人称之为字符用户界面(CUI). 通常认为,命令行界面(CLI)没有图形用户界面(GUI)那么方便用户操作. 因为,命令行界面的软件通常 ...

  8. Codeforces 1264D - Beautiful Bracket Sequence(组合数学)

    Codeforces 题面传送门 & 洛谷题面传送门 首先对于这样的题目,我们应先考虑如何计算一个括号序列 \(s\) 的权值.一件非常显然的事情是,在深度最深的.是原括号序列的子序列的括号序 ...

  9. #10470. 「2020-10-02 提高模拟赛」流水线 (line)

    题面:#10470. 「2020-10-02 提高模拟赛」流水线 (line) 题目中的那么多区间的条件让人感觉极其难以维护,而且贪心的做法感觉大多都能 hack 掉,因此考虑寻找一些性质,然后再设计 ...

  10. 【python】python之list

    1.判断list是否为空 方式一: list_temp=[] if len(list_temp): #非空即为真 print('list is not empty') else: print('lis ...