C++11std::bind的简单使用

std::bind用来将可调用对象与其参数一起进行绑定,绑定后的结果可以用std::function(可调用对象包装器)进行保存,并延迟调用到任何我们需要的时候。

通俗来讲,它主要有两大作用:

(1)将可调用对象与其参数绑定成一个仿函数。

(2)将多元(参数个数为n,n>1)可调用对象转换成一元或者(n-1)元可调用对象,即只绑定部分参数。

注:std::placeholders为一个占位符,代表这个位置在函数调用时,将被第几个参数所替代。

void call_when_even(int x, const std::function<void(int)>& f)
{
	if (x % 2 == 0)
	{
		f(x);
	}
}
void output(int x)
{
	cout << x << endl;
}
void output_add_2(int x)
{
	cout << x + 2 << endl;
}
//placeholders为占位符的意思,用于函数绑定的时候,缺省函数的占位符
int main()
{
	{
		auto fr = std::bind(output, std::placeholders::_1);
		for (int i = 1; i <= 10; ++i)
		{
			call_when_even(i, fr);
		}
	}
	{
		auto fr1 = std::bind(output_add_2, std::placeholders::_1);
		for (int i = 1; i <= 10; ++i)
		{
			call_when_even(i, fr1);
		}
	}
	return 0;
}
void output(int x, int y)
{
	cout << x << " " << y << endl;
}
int main(void)
{
	std::bind(output, 1, 2)();//输出1 2
	std::bind(output, std::placeholders::_1, 2)(1);//输出1 2
	std::bind(output, 2, std::placeholders::_1)(1);//输出2 1
	//std::bind(output, 1, std::placeholders::_2)(1);	error,调用时没有第二个参数,缺少第二个参数
	std::bind(output, 2, std::placeholders::_2)(1, 2);//输出2 2,调用时第一个参数直接被吞并了
	std::bind(output, std::placeholders::_1, std::placeholders::_2)(10, 20);//10 20
	std::bind(output, std::placeholders::_2, std::placeholders::_1)(30, 40);//40 30
	return 0;
}
class Test
{
public:
	int value = 0;
	void output(int x, int y)
	{
		cout << x << " " << y << endl;
	}
};
int main()
{
	Test test;
	/*std::function<void(int, int)> fr = std::bind(&Test::output,
		std::placeholders::_1, std::placeholders::_2);
	fr(1, 2);*/
	std::function<int& (void)> fr_i = std::bind(&Test::value, &test);
	fr_i() = 123;
	cout << test.value << endl;
	return 0;
}
struct Test
{
public:
	static const int Add(const int& x, const int& y)
	{
		return x + y;
	}
};
int main()
{
	std::function<const int(const int&, const int&)> fr = std::bind(Test::Add, std::placeholders::_1, std::placeholders::_2);
	cout << fr(11, 44) << endl;
	return 0;
}

struct Test
{
public:
	template<class T>
	const T Add(const T& x, const T& y)
	{
		return x + y;
	}
};
int main()
{
	Test test;
	std::function<const int(const int&, const int&)> fr = std::bind(Test::Add<int>,test,std::placeholders::_1,std::placeholders::_2);
	cout << fr(10,20) << endl;
	return 0;
}

相关推荐

  1. C++11std::bind简单使用

    2024-05-25 21:10:39       30 阅读
  2. c++11线程库使用

    2024-05-25 21:10:39       27 阅读
  3. C#Tcp简单使用

    2024-05-25 21:10:39       30 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-05-25 21:10:39       91 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-05-25 21:10:39       97 阅读
  3. 在Django里面运行非项目文件

    2024-05-25 21:10:39       78 阅读
  4. Python语言-面向对象

    2024-05-25 21:10:39       88 阅读

热门阅读

  1. el-select 组件获取整个对象

    2024-05-25 21:10:39       36 阅读
  2. K8S Secret管理之SealedSecrets

    2024-05-25 21:10:39       30 阅读
  3. c++入门

    c++入门

    2024-05-25 21:10:39      36 阅读
  4. 分布式和集群区别

    2024-05-25 21:10:39       30 阅读
  5. 华为校招机试 - 最久最少使用缓存(20240508)

    2024-05-25 21:10:39       27 阅读
  6. 数据仓库、数据中台、大数据平台之间的关系

    2024-05-25 21:10:39       34 阅读
  7. MYSQL课堂练习

    2024-05-25 21:10:39       36 阅读
  8. 向量数据库的使用

    2024-05-25 21:10:39       33 阅读
  9. day50

    2024-05-25 21:10:39       37 阅读