参数绑定

bind作用和形式

bind用于将一个可调用对象绑定到新的可调用对象上,新对象的参数就是被绑定对象参数列表中的占位符所占据的位置的参数
其调用形式如下:

auto newCallable=bind(callable,arg_list);

bind的第一个参数为一个可调用对象,可调用对象是指可以对其使用调用运算符()的对象。
可调用对象常用的有函数、函数指针、重载了函数调用运算符的类和lambda表达式
arg_list是调用对象的参数列表,可以包含 _ 1, _ 2等这样的占位符,用于占据调用对象的参数位置,数字代表着是第几个参数,占位符被定义在,命名空间placeholders中。也可以包含被绑定对象的参数。arg_list应该和被绑定对象的参数一样多。

example

int sum(int a, int b, int c) {
	if (a > b)return a + c;
	return b + c;
}
auto add = bind(sum, _1, _2, 10);

这样就将sum绑定由bind新生成的一个调用sum的对象上;
_ 1表示新对象中的第一个参数,是一个占位符。
也就是说,实际上,这个bind会add( _ 1, _ 2)会被映射成为sum( _ 1, _ 2, 10),此时add的参数就会代替原来的占位符成为调用sum的参数,当然前提是两者的类型要匹配。
比如:add(20,10)实际调用为sum(20,10,10),结果为30;

参数顺序可换

#include<bits/stdc++.h>
using namespace std;
using namespace placeholders;
int sum(int a, int b, int c) {
	if (a > b)return a + c;
	return b + c;
}
int main(void) {
	auto add  = bind(sum, _1, _2, 10);
	auto add2 = bind(sum, _2, _1, 10);
	int t = add(20, 10), t1 = add2(10,20);
	cout << t << " " << t1 << endl;
	return 0;
}

bind也可以换原来参数的顺序,因为实际在调用新对象时,我们传递给新对象的参数实际就是那些占位符占据的位置的参数,所以上面调用情况如下:
add(20,10) 时,参数20对应占位符1,参数10对应占位符2,故实际调用为sum(20,10,10);
add2(10,20)时,参数10对应占位符1,参数20对应占位符2,故实际调用为sum(20,10,10);
从而重排了参数顺序。

posted @   Chasssser  阅读(264)  评论(0编辑  收藏  举报
编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
历史上的今天:
2018-10-29 LL(1)文法--递归下降程序
点击右上角即可分享
微信分享提示