服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C/C++ - c/c++ 标准库 bind 函数详解

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

2021-07-02 15:14小石王 C/C++

bind是一组用于函数绑定的模板。在对某个函数进行绑定时,可以指定部分参数或全部参数,也可以不指定任何参数,还可以调整各个参数间的顺序。这篇文章主要介绍了c/c++ 标准库 bind 函数 ,需要的朋友可以参考下

bind函数定义在头文件 functional 中。可以将 bind 函数看作一个通用的函数适配器,它接受一个可调用对象,生成一个新的可调用对象来“适应”原对象的参数列表。

bind函数:接收一个函数名作为参数,生成一个新的函数。

?
1
auto newCallable = bind(callbale, arg_list);

arg_list中的参数可能包含入_1, _2等,这些是新函数newCallable的参数。

在这篇博客lambda 表达式 介绍 中,讨论了find_if的第三个参数的问题,当时是用lambda表达式解决的,有了bind函数后,也可以用bind函数解决。

解决办法:bind(check_size, _1, sz)

?
1
auto idx = find_if(svec.begin(),svec.end(),bind(check_size, _1, 6));

其实,newCall= bind(check_size, _1, sz)返回了一个新的函数newCall ,这个newCall 只接受一个参数,正好满足find_if的要求。

•从find_if的角度来看,啊,newCall是含有一个参数的函数,OK,没问题。
•从程序猿的角度看,check_size是含有2个参数的函数,只是提前把sz(6)绑定到了newCall上了,
•当调用newCall(s),实际是调用了check_size(s, 6),相当于newCall也有2个参数,只是第二个参数有个默认值为6。newCall(const string &s, size_t sz = 6); ,所以调用newCall时,传递一个参数就够了。

注意:_1,_2等,是放在了命名空间placeholder中,所以要使用:

?
1
2
//_1,_n定在std::placeholders里面
using namespace std::placeholders;

bind参数用法:

?
1
2
//g是以个有2个参数的可调用对象
auto g = bind(func, a, b, _2, c, _1);//func是有5个参数的函数

调用g(X, Y), 等于 func(a, b, Y, c, X)

例子:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
#include <functional>
using namespace std;
//_1,_n定在std::placeholders里面                       
using namespace std::placeholders;
bool check_size(const string &s, string::size_type sz){
 return s.size() >= sz;
}
bool shorter(const string &a, const string &b){
 return a.size() < b.size();
}
ostream& print(ostream& os, const string &s, const char &c){
 //c = ',';                                 
 return os << s << c;
}
int main(){
 /*                                     
 //用bind实现了和lambda一样的功能                      
 vector<string> svec{"aab","d","aa","bb","e","bbb"};             
 stable_sort(svec.begin(),svec.end(),[](const string &a, const string &b){  
   return a.size() < b.size();                       
  });                                    
 string::size_type sz = 3;                          
 auto idx = find_if(svec.begin(),svec.end(),bind(check_size, _1, sz));    
 cout << *idx << endl;                            
 idx = find_if(svec.begin(),svec.end(),[sz](const string &s){        
   return s.size() >= sz;                         
  });                                    
 cout << *idx << endl;                            
 */
 /*                                     
 //用bind改变原来函数的参数的位置                      
 //升序                                   
 vector<string> svec{"aab","d","aa","bb","e","bbb"};             
 sort(svec.begin(), svec.end(), shorter);                  
 for(auto const &s : svec){                         
  cout << s << " ";                             
 }                                      
 cout << endl;                                
 //由于调换了shorter参数的位置,所以变成了降序                
 sort(svec.begin(), svec.end(),bind(shorter, _2, _1));            
 for(auto const &s : svec){                         
  cout << s << " ";                             
 }                                      
 cout << endl;                                
 */
 //bind引用,必须使用ref或者cref函数,把对象转化成引用,不能用&        
 ostream &os = cout;
 const char c = ' ';
 vector<string> svec{"aab","d","aa","bb","e","bbb"};
 for_each(svec.begin(),svec.end(),[&os, c](const string &s){
   os << s << c;
  });
 os << endl;
 for_each(svec.begin(),svec.end(),bind(print, ref(os), _1, cref(c)));
 os << endl;
 cout << c << endl;
}

总结

以上所述是小编给大家介绍的c/c++ 标准库 bind 函数详解,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对服务器之家网站的支持!

原文链接:https://www.cnblogs.com/xiaoshiwang/archive/2018/09/20/9678769.html

延伸 · 阅读

精彩推荐
  • C/C++OpenCV实现拼接图像的简单方法

    OpenCV实现拼接图像的简单方法

    这篇文章主要为大家详细介绍了OpenCV实现拼接图像的简单方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    iteye_183805102021-07-29
  • C/C++C语言main函数的三种形式实例详解

    C语言main函数的三种形式实例详解

    这篇文章主要介绍了 C语言main函数的三种形式实例详解的相关资料,需要的朋友可以参考下...

    ieearth6912021-05-16
  • C/C++深入C++拷贝构造函数的总结详解

    深入C++拷贝构造函数的总结详解

    本篇文章是对C++中拷贝构造函数进行了总结与介绍。需要的朋友参考下...

    C++教程网5182020-11-30
  • C/C++c/c++实现获取域名的IP地址

    c/c++实现获取域名的IP地址

    本文给大家汇总介绍了使用c/c++实现获取域名的IP地址的几种方法以及这些方法的核心函数gethostbyname的详细用法,非常的实用,有需要的小伙伴可以参考下...

    C++教程网10262021-03-16
  • C/C++c/c++内存分配大小实例讲解

    c/c++内存分配大小实例讲解

    在本篇文章里小编给大家整理了一篇关于c/c++内存分配大小实例讲解内容,有需要的朋友们可以跟着学习参考下。...

    jihite5172022-02-22
  • C/C++关于C语言中E-R图的详解

    关于C语言中E-R图的详解

    今天小编就为大家分享一篇关于关于C语言中E-R图的详解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看...

    Struggler095962021-07-12
  • C/C++使用C++制作简单的web服务器(续)

    使用C++制作简单的web服务器(续)

    本文承接上文《使用C++制作简单的web服务器》,把web服务器做的功能稍微强大些,主要增加的功能是从文件中读取网页并返回给客户端,而不是把网页代码...

    C++教程网5492021-02-22
  • C/C++C语言实现双人五子棋游戏

    C语言实现双人五子棋游戏

    这篇文章主要为大家详细介绍了C语言实现双人五子棋游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    两片空白7312021-11-12