c++11 std::bind与std::ref、std::cref

在这里插入图片描述
直接看代码:

#include<iostream>
#include<functional>

using namespace std;

int add(int &a,int &b)
{
  a = 0;
  b = 0;
  return a+b;
}

int main()
{
  int a = 2,b = 3;
  auto func1 = bind(add,1,2);
  cout<<"func1:"<<func1()<<endl;

  auto func2 = bind(add,a,b);
  cout<<"func2:"<<func2()<<endl;
  cout<<"a:"<<a<<endl;
  cout<<"b:"<<b<<endl;


  auto func3 = bind(add,std::ref(a),std::ref(b));
  cout<<"func3:"<<func3()<<endl;
  cout<<"a:"<<a<<endl;
  cout<<"b:"<<b<<endl;

  return 0;
}

运行结果:
在这里插入图片描述
虽然add函数对的参数是引用类型的,但是通过bind调用之后还是无法引用传递,所以需要std:ref。
下面看一个std:;function与std::bind、std::ref、std::cref结合使用的例子

#include <iostream>
#include <functional>

using namespace std;

int add1(int &a, int &b) 
{
	a = 0;
	b = 0;
	return a + b;
}

int add2(const int &a, int &b)
{
	//a = 0;
	b = 0;
	return a + b;
}

int function_add(std::function<int(void)> func)
{	
	return func();
}

int main() 
{
    //bind-function
	int a = 2, b = 3;
	cout << "function_add(std::bind(add1, a, b)):" << function_add(std::bind(add1, a, b)) << endl;
	cout << "a:" << a << "  b:" << b << endl;
	
    //ref-bind-function
	a = 2, b = 3;
	cout << "function_add(std::bind(add1, a, b)):" << function_add(std::bind(add1, std::ref(a), std::ref(b))) << endl;
	cout << "a:" << a << "  b:" << b << endl;

    //cref-bind-function
	a = 2, b = 3;
	cout << "function_add(std::bind(add1, a, b)):" << function_add(std::bind(add2, std::cref(a), std::ref(b))) << endl;
	cout << "a:" << a << "  b:" << b << endl;
	return 0; 
}

运行结果:
在这里插入图片描述
std::ref 用于包装按引用传递的值。
std::cref 用于包装按const引用传递的值
例子中还用了std::function 来包装分发函数,需要注意的是std::bind转std::function和function的实例调用,如果bind已经将参数全部绑定完成,则function的定义处参数列表为空就行。

人,总是要有一点精神的,不是吗

发布了32 篇原创文章 · 获赞 23 · 访问量 868

猜你喜欢

转载自blog.csdn.net/weixin_40179091/article/details/105380330
今日推荐