【问题标题】:Binding to a member variable绑定到成员变量
【发布时间】:2009-07-21 10:31:37
【问题描述】:

当我们绑定到成员变量时,我对 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

【问题讨论】:

    标签: c++ boost boost-bind


    【解决方案1】:

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

    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
    }
    

    在后台绑定是编写不同的调用。生成的仿函数采用 std::map::iterator 的取消引用(std::pair 类型)。传递给内部绑定,取消引用成员指针,从而将(*it).second 返回到外部绑定,外部绑定将该值传递给print_string 方法以进行最终调用:print_string( (*it).second )

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

    【讨论】:

      【解决方案2】:
      boost::bind(&std::pair<U,V>::second, _1);
      

      在功能上等同于

      std::pair<U,V> p -> p.second
      

      即。它是一个将pair&lt;U,V&gt; 映射到其second 成员的函数(对象)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-08-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-07-11
        相关资源
        最近更新 更多