c – 绑定到成员变量

c – 绑定到成员变量,第1张

概述我很困惑当我们绑定成员变量时boost :: bind会做什么.通过绑定到成员函数,我们实际上创建了一个函数对象,然后调用它将通过占位符提供或延迟并替换的参数传递给它. 但这个表达在幕后做了什么: boost::bind(&std::pair::second, _1); 用什么替代占位符_1? 我从一篇关于boost :: bind的文章中读到这个例子时发现了这个: void print_str 我很困惑当我们绑定到成员变量时boost :: bind会做什么.通过绑定到成员函数,我们实际上创建了一个函数对象,然后调用它将通过占位符提供或延迟并替换的参数传递给它.

但这个表达在幕后做了什么:

boost::bind(&std::pair::second,_1);

用什么替代占位符_1?

我从一篇关于boost :: bind的文章中读到这个例子时发现了这个:

voID print_string(const std::string& s) {  std::cout << s << '\n';}std::map<int,std::string> my_map;my_map[0]="Boost";my_map[1]="Bind";std::for_each(  my_map.begin(),my_map.end(),boost::bind(&print_string,boost::bind(      &std::map<int,std::string>::value_type::second,_1)));


source

解决方法 在幕后,它使用成员指针并将其应用于传入的参数.它在绑定的上下文中非常复杂,所以这里有一个指向成员用法的简单示例:
int main(){   std::pair< int,int > p1 = make_pair( 1,2 );   std::pair< int,int > p2 = make_pair( 2,4 );   int std::pair<int,int>::*ptr = &std::pair<int,int>::second; // pointer to second member   std::cout << p1.*ptr << std::endl; // 2 dereference pointer to member    std::cout << p2.*ptr << std::endl; // 4 dereference pointer to member}

在幕后,bind正在组成不同的调用.生成的仿函数采用std :: map<> :: i@R_403_6704@tor(类型为std :: pair< const key_type,value_type>)的解除引用.这被传递给内部绑定,它取消引用成员指针,从而将(* it).second返回到外部绑定,该绑定将该值传递给最终调用的print_string方法:print_string((* it).second).

(*它)实际上是你问过的_1.所有_#都是占位符,也就是说,bind的结果将是一个仿函数,它将占用尽可能多的参数,因为占位符数定义的顺序中存在不同的占位符.在您给出的示例中,生成的仿函数采用单个参数_1.

总结

以上是内存溢出为你收集整理的c – 绑定到成员变量全部内容,希望文章能够帮你解决c – 绑定到成员变量所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/1240791.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-06
下一篇2022-06-06

发表评论

登录后才能评论

评论列表(0条)

    保存