c++ - 绑定(bind)到成员变量

标签 c++ boost boost-bind

当我们绑定(bind)到成员变量时,我对 boost::bind 做了什么感到困惑。通过绑定(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

最佳答案

在幕后,它使用成员指针并将其应用于传入的参数。它在绑定(bind)的上下文中相当复杂,所以这里是一个指向成员使用的指针的简单示例:

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<>::iterator(类型为 std::pair< const key_type, value_type >)的取消引用。这被传递给内部绑定(bind),取消引用成员指针,从而将 (*i​​t).second 返回给外部绑定(bind),该外部绑定(bind)将该值传递给 print_string 方法最后调用:print_string( (*it).second ).

(*i​​t) 实际上是您询问的 _1。所有的 _# 都是占位符,也就是说,bind 的结果将是一个仿函数,它将按照占位符的数量定义的顺序接受与不同占位符存在的参数一样多的参数。在您给出的示例中,生成的仿函数采用单个参数 _1

关于c++ - 绑定(bind)到成员变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1158390/

相关文章:

c++ - 如何创建一个带有参数的函数,该参数将是 boost::bind 的结果?

c++ - 在循环内检查 std::vector 大小的正确方法

c++ - 查找由智能指针引起的内存泄漏

c++ - glibc 检测到 : double free or corruption

c++ - Qt VS 工具 : error reading VS project settings

c++ - Boost::filesystem::is_symlink() 不起作用

python - 删除 std::vector 中由 boost::python 公开的指针

c++ - 有没有办法打印 boost 程序选项的配置文件

c++ - 以 C++11 方式重写 boost 风格的代码(Boost.Bind、Boost.Function)

c++ - boost::bind、boost::lambda::bind 和 boost::phoenix::bind 之间的区别