在以下示例中,占位符在Boost :: bind中的作用

时间:2013-09-08 05:03:16

标签: c++ boost-bind

关于占位符的使用有很多关于占位符的例子但是我仍然有点困惑,如果有人可以解释以下两个陈述之间的区别,我会很感激

void SomeMethod(int a)
{
    std::cout << "Parameter pass " << a << "\n";
}

Statement 1 : boost::bind(&SomeMethod,_1)(12);

Statement 2 : boost::bind(&SomeMethod,12)();

我相信我理解了链接的陈述1。 boost::bind(&SomeMethod,_1)的输出附加了12的参数。但是我很难理解在语句2中发生的事情。如果参数可以使用boost :: bind直接传递(如语句2中那样)那么为什么需要占位符?

1 个答案:

答案 0 :(得分:4)

占位符的一个用途是更改特定函数的参数顺序

取自提升的示例。假设您之前有f(x, y)g(x,y,z)。然后

bind(f, _2, _1)(x, y);                 // f(y, x)    
bind(g, _1, 9, _1)(x);                 // g(x, 9, x)    
bind(g, _3, _3, _3)(x, y, z);          // g(z, z, z)    
bind(g, _1, _1, _1)(x, y, z);          // g(x, x, x)

有趣的是要注意关于最后一个例子的以下BOOST指南声明

  

请注意,在最后一个示例中,bind(g,_1,_1,_1)生成的函数对象不包含对第一个参数之外的任何参数的引用,但它仍然可以与多个参数一起使用。任何额外的参数都会被忽略,就像在第三个例子中忽略第一个和第二个参数一样。

我认为现在很明显,占位符使这种替代品变得更干净,更优雅。

在您的特定情况下,2种用途是等效的。

  

可以选择性地仅绑定一些参数。 bind(f,_1,5)(x)等价于f(x,5);这里_1是一个占位符参数,表示&#34;用第一个输入参数替换。&#34;

占位符的另一个好用途是当你有很多参数而你只想绑定其中一个时。示例:想象h(a,b,c,d,e,f,g),您只想绑定第6个参数!