首页 > 编程语言 >C++11:std::bind

C++11:std::bind

时间:2022-09-28 21:01:51浏览次数:68  
标签:11 std int bind 绑定 C++ func function


std::bind是这样一种机制,它可以预先把指定可调用实体的某些参数绑定到已有的变量,产生一个新的可调用实体,这种机制在回调函数的使用过程中也颇为有用。

C++98中,有两个函数bind1st和bind2nd,它们分别可以用来绑定functor的第一个和第二个参数,它们都是只可以绑定一个参数,各种限制,使得bind1st和bind2nd的可用性大大降低。

在C++11中,提供了std::bind,它绑定的参数的个数不受限制,绑定的具体哪些参数也不受限制,由用户指定,这个bind才是真正意义上的绑定。

std::bind的基本语法:

#include <iostream>
#include <functional> //std::bind
using namespace std;

void func(int x, int y)
{
cout << x << " " << y << endl;
}

int main()
{
bind(func, 1, 2)(); //输出:1 2
bind(func, std::placeholders::_1, 2)(1);//输出:1 2

using namespace std::placeholders; // adds visibility of _1, _2, _3,...
bind(func, 2, _1)(1); //输出:2 1
bind(func, 2, _2)(1, 2); //输出:2 2
bind(func, _1, _2)(1, 2); //输出:1 2
bind(func,_2, _1)(1, 2); //输出:2 1

//err, 调用时没有第二个参数
//bind(func, 2, _2)(1);

return 0;
}

std::placeholders::_1是一个占位符,代表这个位置将在函数调用时,被传入的第一个参数所替代。

std::bind和std::function配合使用:

#include <iostream>
#include <functional> //std::cout
using namespace std;
using namespace std::placeholders; // adds visibility of _1, _2, _3,...

class Test
{
public:
int i = 0;

void func(int x, int y)
{
cout << x << " " << y << endl;
}
};

int main()
{
Test obj; //创建对象

function<void(int, int)> f1 = bind(&Test::func, &obj, _1, _2);
f1(1, 2); //输出:1 2

function< int &()> f2 = bind(&Test::i, &obj);
f2() = 123;
cout << obj.i << endl;//结果为 123

return 0;
}

通过std::bind和std::function配合使用,所有的可调用对象均有了统一的操作方法。

参考资料:
1、​​​C++ function、bind以及lamda表达式​​​
2、​​​深入应用C++11 代码优化与工程级应用​


标签:11,std,int,bind,绑定,C++,func,function
From: https://blog.51cto.com/u_3002289/5720827

相关文章

  • std::remove并非你所想
    目录结论实现过程注意事项结论std::remove并没有删除元素,只是将指定元素交换到了容器后面删除元素需要配合erase完成实现过程代码 //演示代码 std::vector<int......
  • 【C/C++】strlen和sizeof
    1chara[]={'c','+','+'};2charc[]="c++";3cout<<strlen(a)<<endl;4cout<<strlen(c)<<endl;5cout<<sizeof(a)<<endl;6......
  • C++ 内存模型与顺序一致性
    目录顺序一致性什么是内存模型?什么是顺序一致性?强顺序与弱顺序顺序一致性与内存模型的强弱顺序C++内存顺序(memory_order)memory_order有哪些?如何使用memory_order?顺序一致......
  • C++11:强类型枚举
    C++11引入了一种新的枚举类型,即“枚举类”,又称“强类型枚举”。声明请类型枚举非常简单,只需要在enum后加上使用class或struct。如:enumOld{Yes,No};//oldstyl......
  • C++11:类的改进
    继承构造C++11允许派生类继承基类的构造函数(默认构造函数、复制构造函数、移动构造函数除外)。#include<iostream>usingnamespacestd;//基类classA{public:A(intx,......
  • C++11:右值引用
    左值、右值在C语言中,我们常常会提起左值(lvalue)、右值(rvalue)这样的称呼。一个最为典型的判别方法就是,在赋值表达式中,出现在等号左边的就是“左值”,而在等号右边的,则称为“右......
  • DFS算法练习 POJ1111; POJ1129; POJ2245; POJ2657
    POJ1111:importjava.util.Scanner;/***@Authorjinjun99*@DateCreatedin2022/9/279:49*@Description*@Sinceversion-1.0*/publicclassMain{......
  • 【C++】从零开始的CS:GO逆向分析2——配置GLFW+IMGUI环境并创建透明窗口
    【C++】从零开始的CS:GO逆向分析2——配置GLFW+IMGUI环境并创建透明窗口 使用的环境:VisualStudio2017,创建一个控制台程序作为工程文件1.配置glfw在github上下载GLFW......
  • C++11:初始化
    类内成员初始化classMem{public:Mem(inti):m(i){}//初始化列表给m初始化intm;};classGroup{public:Group(){}private:intdata=1;//使用"=......
  • C++11:移动语义
    为什么需要移动语义#include<iostream>usingnamespacestd;classTest{public:Test(inta=0){//普通构造函数d=newint(a);cout<<"构造函......